乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

       POST、GET、@RequestBody和@RequestParam區(qū)別

       wwq圖書世界 2021-05-11

      @RequestParam

      注解@RequestParam接收的參數(shù)是來自HTTP請求體或請求url的QueryString中。

      RequestParam可以接受簡單類型的屬性,也可以接受對象類型。

      @RequestParam有三個(gè)配置參數(shù):

      • required 表示是否必須,默認(rèn)為 true,必須。
      • defaultValue 可設(shè)置請求參數(shù)的默認(rèn)值。
      • value 為接收url的參數(shù)名(相當(dāng)于key值)。

      @RequestParam用來處理 Content-Typeapplication/x-www-form-urlencoded 編碼的內(nèi)容,Content-Type默認(rèn)為該屬性。@RequestParam也可用于其它類型的請求,例如:POST、DELETE等請求。

      所以在postman中,要選擇body的類型為 x-www-form-urlencoded,這樣在headers中就自動(dòng)變?yōu)榱?Content-Type : application/x-www-form-urlencoded 編碼格式。如下圖所示:

      但是這樣不支持批量插入數(shù)據(jù)啊,如果改用 json 字符串來傳值的話,類型設(shè)置為 application/json,點(diǎn)擊發(fā)送的話,會(huì)報(bào)錯(cuò),后臺(tái)接收不到值,為 null

      但可以入?yún)⒑笤俎D(zhuǎn)換,參考如下:

      1. @PostMapping("/ali-receive")
      2. public void aliReceive(@RequestParam("message") String message) {
      3. ReceiveLog receiveLog = JSON.parseObject(message, ReceiveLog.class);
      4. }

      解決Spring/SpringBoot @RequestParam注解無法讀取application/json格式數(shù)據(jù):https://blog.csdn.net/weixin_42536015/article/details/106906055

      @RequestParam 接受JSON的字符串:https://blog.csdn.net/qq_40470612/article/details/104225419

       

      不推薦使用@RequestParam接收application/json,這時(shí)候就需要使用到@RequestBody。

       

      @RequestBody


      注解@RequestBody接收的參數(shù)是來自requestBody中,即請求體。一般用于處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數(shù)據(jù),比如:application/jsonapplication/xml等類型的數(shù)據(jù)。

      application/json類型的數(shù)據(jù)而言,使用注解@RequestBody可以將body里面所有的json數(shù)據(jù)傳到后端,后端再進(jìn)行解析。

      GET請求中,因?yàn)闆]有HttpEntity,所以@RequestBody并不適用。

      POST請求中,通過HttpEntity傳遞的參數(shù),必須要在請求頭中聲明數(shù)據(jù)的類型Content-Type,SpringMVC通過使用

      HandlerAdapter 配置的HttpMessageConverters來解析HttpEntity中的數(shù)據(jù),然后綁定到相應(yīng)的bean上。

       

      向表中批量插入數(shù)據(jù)

      舉個(gè)批量插入數(shù)據(jù)的例子,Controller層的寫法如下圖所示:

      由于@RequestBody可用來處理 Content-Typeapplication/json 編碼的內(nèi)容,所以在postman中,選擇body的類型為row -> JSON(application/json),這樣在 Headers 中也會(huì)自動(dòng)變?yōu)?Content-Type : application/json 編碼格式。body內(nèi)的數(shù)據(jù)如下圖所示:

      批量向表中插入兩條數(shù)據(jù),這里的 saveBatchNovel()方法已經(jīng)封裝了 JPAsaveAll() 方法。body 里面的 json 語句的 key 值要與后端實(shí)體類的屬性一一對應(yīng)。

      注意:前端使用$.ajax的話,一定要指定 contentType: "application/json;charset=utf-8;",默認(rèn)為 application/x-www-form-urlencoded。

      后端解析json數(shù)據(jù)

      上述示例是傳遞到實(shí)體類中的具體寫法,那么如果傳遞到非實(shí)體類中,body里面的json數(shù)據(jù)需要怎么解析呢?我們再來看下面這個(gè)例子:

      在body中,我們還是輸入上面的json數(shù)據(jù),根據(jù)分析,上面的json數(shù)據(jù)是一個(gè)List數(shù)組內(nèi)嵌套著map對象,那么在后臺(tái)的接收形式可寫為 List<Map<String, String>>,具體代碼如下圖所示:

      postman請求:

      控制臺(tái)輸出:

      得出結(jié)論,通過@RequestBody可以解析Body中json格式的數(shù)據(jù)。

       

       

      POST請求時(shí)

      @RequestBody --> JSON字符串部分

      @RequestParam --> 請求參數(shù)部分

      application/json格局圖

      form-data、x-www-form-urlencoded格局圖

       

      1、從content-type方面總結(jié):

      ① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。見postman的格局,這兩種方式的時(shí)候沒有json字符串部分。

      ② application/json:json字符串部分可以用@RequestBody;url中的?后面參數(shù)可以用@RequestParam。見postman的格局

       

      2、從兩種注解方式總結(jié):

      @RequestBody

      1. (@RequestBody Map map)
      2. (@RequestBody Object object)
      3. application/json時(shí)候可用
      4. form-data、x-www-form-urlencoded時(shí)候不可用

      @RequestParam

      1. (@RequestParam Map map)
      2. application/json時(shí)候,json字符串部分不可用,url中的?后面添加參數(shù)即可用,form-data、x-www-form-urlencoded時(shí)候可用,但是要將Headers里的Content-Type刪掉
      1. (@RequestParam String waterEleId,@RequestParam String enterpriseName)
      2. application/json時(shí)候,json字符串部分不可用,url中的?后面添加參數(shù)即可用
      3. form-data、x-www-form-urlencoded時(shí)候可用,且參數(shù)可以沒有順序(即前端傳過來的參數(shù)或者url中的參數(shù)順序不必和后臺(tái)接口中的參數(shù)順序一致,只要字段名相同就可以),但是要將Headers里的Content-Type刪掉
      1. (@RequestParam Object object)
      2. 不管application/json、form-data、x-www-form-urlencoded都不可用

      既不是@RequestBody也不是@RequestParam,沒有指定參數(shù)哪種接收方式

      1. (Map map)
      2. (Object object)
      3. application/json時(shí)候:json字符串部分不可用,url中的?后面添加參數(shù)不可用。
      4. 因?yàn)闆]有指定,它也不知道到底是用json字符串部分還是?后面添加參數(shù)部分,所以干脆都不可以用
      5. form-data、x-www-form-urlencoded時(shí)都不可用,見圖二
      6. (HttpServletRequest request)
      7. application/json不可用
      8. form-data、x-www-form-urlencoded時(shí)可用

      GET請求

      @RequestBody

      1. RequestBody -- Map / Object
      2. GET請求中不可以使用@RequestBody

      @RequestParam

      1. (@RequestParam Map map)
      2. 在url中的?后面添加參數(shù)即可使用
      1. (@RequestParam String waterEleId,@RequestParam String enterpriseName)
      2. 在url中的?后面添加參數(shù)即可使用
      1. (@RequestParam Object object)
      2. GET請求中不可以使用

      當(dāng)使用GET請求時(shí),通過postman添加?后面的參數(shù),不用在url中自己一個(gè)一個(gè)拼,點(diǎn)擊Params,在下面key-value中輸入就自動(dòng)拼接到url中

       

       

      舉栗子

      上傳文件,包含了圖中圈出來的兩部分

      如果這樣,沒有@RequestParam,那么url?后的參數(shù)就拿不到

      1. @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
      2. public ResponseObj<Boolean> leadingIn(Map formData,
      3. HttpServletRequest request,
      4. Map<String, InputStream> files) {
      5. }

      如果control中這樣接收,本來想formData只接收url?后的參數(shù),結(jié)果將{ "retCode": null, "data": true }這部分內(nèi)容也拿到了,真實(shí)意外之喜。字符串這部分內(nèi)容還可以從request中取到,見下面完整方法。

      1. @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
      2. public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
      3. HttpServletRequest request,
      4. Map<String, InputStream> files) {
      5. }

      完整方法

      1. /**
      2. * 導(dǎo)入
      3. */
      4. @RequestMapping(value = "/leadingIn", method = RequestMethod.POST)
      5. public ResponseObj<Boolean> leadingIn(@RequestParam Map formData,
      6. HttpServletRequest request,
      7. Map<String, InputStream> files) {
      8. //測試
      9. try {
      10. MultipartHttpServletRequest mulRequest = (MultipartHttpServletRequest) request;
      11. Set<Map.Entry<String, MultipartFile>> set = mulRequest.getFileMap().entrySet();
      12. Map<String, InputStream> listFile = new LinkedHashMap<>();
      13. System.out.println("個(gè)數(shù)" + set.size());
      14. for (Map.Entry<String, MultipartFile> each : set) {
      15. String fileName = each.getKey();
      16. MultipartFile file = each.getValue();
      17. //這里需要上傳FTP
      18. try {
      19. listFile.put(fileName, file.getInputStream());
      20. } catch (Exception ex) {
      21. return new ResponseObj<>(false, null);
      22. }
      23. }
      24. String formjson = mulRequest.getParameter("content");
      25. ObjectMapper mapper = new ObjectMapper();
      26. mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
      27. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
      28. // boolean result = iInstallWorkOrder.upLoadFile(listFile);
      29. boolean result = true;
      30. return new ResponseObj<>(result, null);
      31. } catch (Exception ex) {
      32. System.out.println(ex.toString());
      33. return new ResponseObj<>(false, null);
      34. }
      35. }



      按F12看一下Network里對應(yīng)請求:

      使用@RequestParam:Content-Type為application/x-www-form-urlencoded,參數(shù)在FormData中



      使用@RequestBody:Content-Type為application/json,參數(shù)在Request PayLoad中


      總結(jié) ·在GET請求中,不能使用@RequestBody。 ·在POST請求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,對于參數(shù)轉(zhuǎn)化的配置必須統(tǒng)一。
      可以使用多個(gè)@RequestParam獲取數(shù)據(jù),@RequestBody不可以 舉個(gè)例子,在SpringMVC配置了HttpMessageConverters處理?xiàng)V?,指定json轉(zhuǎn)化的格式,如Date轉(zhuǎn)成'yyyy-MM-dd’,則參數(shù)接收對象包含的字段如果是Date類型,就只能讓客戶端傳遞年月日的格式,不能傳時(shí)分秒。因?yàn)椴煌慕涌?,它的參?shù)可能對時(shí)間參數(shù)有不同的格式要求,所以這樣做會(huì)讓客戶端調(diào)用同事對參數(shù)的格式有點(diǎn)困惑,所以說擴(kuò)展性不高。 如果使用@RequestParam來接受參數(shù),可以在接受參數(shù)的model中設(shè)置@DateFormat指定所需要接受時(shí)間參數(shù)的格式。 另外,使用@RequestBody接受的參數(shù)是不會(huì)被Servlet轉(zhuǎn)化統(tǒng)一放在request對象的Param參數(shù)集中,@RequestParam是可以的。

       

      另外,還有一種應(yīng)用場景,接口規(guī)范為resultful風(fēng)格時(shí),舉個(gè)例子:如果要獲取某個(gè)id下此條問題答案的查詢次數(shù)的話,則后臺(tái)就需要?jiǎng)討B(tài)獲取參數(shù),其注解為@PathVariable,并且requestMapping中的value應(yīng)為value="/{id}/queryNum",截圖如下:

       

      參考:

      @RequestParam @RequestBody @PathVariable 等參數(shù)綁定注解詳解

      https://blog.csdn.net/walkerjong/article/details/7946109

      https://my.oschina.net/u/3372000/blog/906217

      https://www.jianshu.com/p/4981911d5e15

      https://cloud.tencent.com/developer/article/1414464

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多