1. 程式人生 > >@RequestBody 和 @RequestParam

@RequestBody 和 @RequestParam

目錄

一、請求型別

 POST請求時

GET請求時

二、method = RequestMethod.POST/RequestMethod.GET

三、produces = MediaType.


一、請求型別

                  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")