@RequestBody 和 @RequestParam
目錄
二、method = RequestMethod.POST/RequestMethod.GET
一、請求型別
form-data、x-www-form-urlencoded(預設格式):不可以用 @RequestBody;可以用 @RequestParam;
application/json:json 字串部分可以用 @RequestBody;
Params 格式可以用 @RequestParam。
POST請求時
@RequestBody --> JSON 字串部分
@RequestParam --> 一般請求引數部分
HttpServletRequest request --> 請求資訊
首先看一下簡單的 Controller測試類:
@RequestMapping(value = "/test") @ResponseBody public String test(HttpServletRequest request, @RequestBody Map map) throws ParseException { System.out.println("request = [" + request + "], map = [" + map + "]"); String startDateparam = (String) map.get("startDate"); String dateType = (String) map.get("type"); JSONObject jo = new JSONObject(); jo.put("name",startDateparam); jo.put("dsc", dateType); String returns = jo.toJSONString(); return returns; }
application/json 請求如下圖:
注:JSON(application/json):請求資訊型別,如果不設定或是設定錯誤,後臺會報不支援的錯誤。
返回結果:
JSON (Map、Object) 格式的都可以使用 @RequestBody
但是 form-data、x-www-form-urlencoded 時候不可用。此時就需要 @RequestParam 接收引數:
另外 Params 引數拼接到 url 後也是可以的,如下圖
@RequestMapping(value = "/test") @ResponseBody public String test(HttpServletRequest request, @RequestParam String startDate, @RequestParam String type) throws ParseException { ... }
引數可以沒有順序(即前端傳過來的引數或者url中的引數順序不必和後臺介面中的引數順序一致,只要欄位名相同就可以)
當然,上面程式碼中註解 @RequestParam 不加也是可以的。
@RequestMapping(value = "/test")
@ResponseBody
public String test(HttpServletRequest request,
String startDate,
String type) throws ParseException {
...
}
只有上述 String等基本型別可以接收,如果是 Object/Map 就接收不到,此時不妨看看 HttpServletRequest request。
GET請求時
Postman 中,application/json 請求如下圖:
後臺可以 @RequestBody Map map 接收引數。
Params 形式引數自動拼接到url後,後臺可以 @RequestBody Map map 接收引數。
後臺使用 @RequestParam 接收:
@RequestMapping(value = "/test")
@ResponseBody
public String test(HttpServletRequest request,
@RequestParam String startDate,
@RequestParam String type) throws ParseException {
...
}
二、method = RequestMethod.POST/RequestMethod.GET
@RequestMapping 中引數 method ,無非為了安全考慮,可加可不加。
spring mvc @RequestMapping method 不寫的話,預設GET、POST都支援,根據前端方式自動適應
三、produces = MediaType.
public class MediaType extends MimeType implements Serializable {}
子類 MimeType 增加了對HTTP規範中定義的質量引數的支援。
簡單來說:produces,它的作用是指定返回值型別,不但可以設定返回值型別還可以設定返回值的字元編碼;
需要注意的是:使用了註解 @responseBody 就是返回值是 json 資料:此時 produces 不需要設定。
@RequestMapping(value = "/test",produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
@RequestMapping(value = "/test}", produces="MediaType.APPLICATION_JSON_VALUE"+";charset=utf-8")