zoukankan      html  css  js  c++  java
  • Spring 注解

    https://stackoverflow.com/questions/28039709/what-is-difference-between-requestbody-and-requestparam


    一、问题描述

          由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口。接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报错;在post请求下,后台接收参数的注解为RequestParam时也会报错。

    二、问题原因

         由于spring的RequestParam注解接收的参数是来自于requestHeader中,即请求头,也就是在url中,格式为xxx?username=123&password=456,而RequestBody注解接收的参数则是来自于requestBody中,即请求体中。

    三、解决方法

          因此综上所述,如果为get请求时,后台接收参数的注解应该为RequestParam,如果为post请求时,则后台接收参数的注解就是为RequestBody。附上两个例子,截图如下:

          get请求

      

    post请求

            另外,还有一种应用场景,接口规范为resultful风格时,举个例子:如果要获取某个id下此条问题答案的查询次数的话,则后台就需要动态获取参数,其注解为@PathVariable,并且requestMapping中的value应为value="/{id}/queryNum",截图如下:


    @QueryParam @RequestBody @PathVariable的区别

    handler method 参数绑定常用的注解,我们根据他们处理的Request的不同内容部分分为四类:(主要讲解常用类型)

    A、处理requet uri 部分(这里指uri template中variable,不含queryString部分)的注解:   @PathVariable;

    B、处理request header部分的注解:   @RequestHeader, @CookieValue;

    C、处理request body部分的注解:@RequestParam,  @RequestBody;

    D、处理attribute类型是注解: @SessionAttributes, @ModelAttribute;


    @RequestParam 

    A) 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( 由String到 简单类型的转换操作由ConversionService配置的转换器来完成);因为使用request.getParameter()方式获取参数,所以可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。

    B)用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。(不设置这个属性,好像这就是默认值)

    C) 该注解有两个属性: value、required; value用来指定要传入值的id名称,required用来指示参数是否必须绑定。
    在方法参数里面如是:public @ResponseBody JsonResult getPublishedToposByConnStreamId(@RequestParam(value = "streamId", required = false) String streamId) {}

    @RequestBody


    A) GET、POST方式提时, 根据request header Content-Type的值来判断:
        application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
        multipart/form-data, 不能处理(次类型多用来上传文件类型---即使用@RequestBody不能处理这种格式的数据,@RequestParam这个却是可以处理的。);
        其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);


    B) PUT方式提交时, 根据request header Content-Type的值来判断:(表示没见过put方式滴,可以无视吧。)
        application/x-www-form-urlencoded, 必须;
        multipart/form-data, 不能处理;
        其他格式, 必须;


    说明:request的body部分的数据编码格式由header部分的Content-Type指定;

    最后

    就我的经验来看:

    @RequestBody这个一般处理的是在ajax请求中声明contentType: "application/json; charset=utf-8"时候。也就是json数据或者xml(我没用过这个,用的是json)

    @RequestParam这个一般就是在ajax里面没有声明contentType的时候,为默认的。。。urlencode格式时,用这个。

    看我前面几个截图就可以看出来。
    ————————————————
    版权声明:本文为CSDN博主「李学凯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_27093465/java/article/details/50519444



    CORS 跨域注解 @CrossOrigin
    https://www.cnblogs.com/mmzs/p/9167743.html



  • 相关阅读:
    身体很累(0,25)
    近期安排
    石子合并问题圆形版 HRBUST 1819区间dp+环形+四边形优化
    Common Subsequence HDU 1159 最长公共子序列Longest Common Subsequence,LCS
    二维树状数组 1:单点修改,区间查询 LibreOJ 133
    c++位运算
    石子合并问题直线版 HRBUST 1818 简单区间动规
    最少拦截系统 HDU 1257 LIS最长递增子序列
    Longest Common Subsequence Again HDU 2253 LCS+位压缩
    石子合并 HYSBZ 3229 区间dp,最优二叉树问题,加西亚瓦克斯算法(GarsiaWachs)
  • 原文地址:https://www.cnblogs.com/cx2016/p/12738297.html
Copyright © 2011-2022 走看看