zoukankan      html  css  js  c++  java
  • 使用Restful风格中的post使用过遇到前端数据传送不到后端

     问题描述:使用postman进行请求时候,前端的数据,一直在后端接收不到,找了好多资料,竟然是因为一个注解的原因。

    后端接收设置:@RequestParam@ReqeustBody设置的原因

      因为spring中的ReqeustParam注解接收的参数来自于requestHeader中,即请求头中,也就是url中,格式为xxx?username=18&password=123,而ReqeustBody注解接收的参数则来自于requestBody中,即请求体中.

    前端我使用的是Content-Type默认是

    application/json;charset=UTF-8

    而服务器是

    'Content-Type': 'application/x-www-form-urlencoded'

    后端的一些常用的设置为:

    一:

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

          get请求

     @RequestMapping(value = "/anaData")
        public String selectOrderInfo(@RequestParam("method") String method, @RequestParam Map<String,Object> params) {
            LOG.debug(TextUtils.format("/***数据 分析模块,統計查詢 通用方法{0}**/", method));
            return analysisClientService.selectOrderInfo(method,params);
        }

    post请求

     @PostMapping(value = "/center")
        public String requestApi(@RequestBody Map<String, Object> params){
            loger.debug(TextUtils.format("调用开始------"));
            return apiCenterClientService.requestApi(params);
        }

    如果参数 有HttpServletRequest需要 注入可以用下面方式

      在Controller中注入了HttpServletRequest,形式如下所示:

    @RestController
    public class AutowiredRequestController {
     
        @Autowired
        private HttpServletRequest request;
    }

    不会有线程安全问题!Controller层中所注入的HttpServletReuqest的实现类为JDK动态代理生成的一个代理类,从Request中获取值的时候是从ThreadLocal中得到的对象中的值。

    @RequestParam
    用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容。提交方式为get或post。(Http协议中,如果不指定Content-Type,则默认传递的参数就是application/x-www-form-urlencoded类型)

    RequestParam实质是将Request.getParameter() 中的Key-Value参数Map利用Spring的转化机制ConversionService配置,转化成参数接收对象或字段。

    get方式中query String的值,和post方式中body data的值都会被Servlet接受到并转化到Request.getParameter()参数集中,所以@RequestParam可以获取的到

    @RequestBody
    处理HttpEntity传递过来的数据,一般用来处理非Content-Type: application/x-www-form-urlencoded编码格式的数据。

    GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。
    POST请求中,通过HttpEntity传递的参数,必须要在请求头中声明数据的类型Content-Type,SpringMVC通过使用HandlerAdapter 配置的HttpMessageConverters来解析HttpEntity中的数据,然后绑定到相应的bean上。

    @RequestBody用于post请求,不能用于get请求

    这里涉及到使用@RequestBody接收不同的对象
    1. 创建一个新的entity,将两个entity都进去。这是最简单的,但是不够“优雅”。
    2. 用Map<String, Object>接受request body,自己反序列化到各个entity中。
    3. 类似方法2,不过更为generic,实现自己的HandlerMethodArgumentResolver。

    当前台界面使用GET或POST方式提交数据时,数据编码格式由请求头的ContentType指定。分为以下几种情况:
    1. application/x-www-form-urlencoded,这种情况的数据@RequestParam、@ModelAttribute可以处理,@RequestBody也可以处理。
    2. multipart/form-data,@RequestBody不能处理这种格式的数据。(form表单里面有文件上传时,必须要指定enctype属性值为multipart/form-data,意思是以二进制流的形式传输文件。)
    3. application/json、application/xml等格式的数据,必须使用@RequestBody来处理。

    在这里卡住了,卡的可难受了.留下这个,给自己长点记性

  • 相关阅读:
    深入浅出 JVM ClassLoader
    JVM 线上故障排查基本操作
    深入浅出 JVM GC(3)
    MyBatis 源码分析系列文章合集
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析
    MyBatis 源码分析系列文章导读
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/11361320.html
Copyright © 2011-2022 走看看