前端请求restful风格接口怎么传参_使用Restful风格中的post使用过遇到前端数据传送不到后端...

本文主要探讨前端使用RESTful风格接口进行POST请求时,参数无法到达后端的问题。关键在于理解@RequestParam和@RequestBody的区别。@RequestParam接收请求头中的URL参数,而@RequestBody接收请求体中的数据。当前端Content-Type为'application/json;charset=UTF-8',后端为'application/x-www-form-urlencoded'时,会导致参数传递失败。解决办法包括调整后端注解或前端Content-Type,或者使用适合的参数处理方式。

问题描述:使用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 Mapparams) {

LOG.debug(TextUtils.format("/***数据 分析模块,統計查詢 通用方法{0}**/", method));returnanalysisClientService.selectOrderInfo(method,params);

}

post请求

@PostMapping(value = "/center")public String requestApi(@RequestBody Mapparams){

loger.debug(TextUtils.format("调用开始------"));returnapiCenterClientService.requestApi(params);

}

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

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

@RestControllerpublic classAutowiredRequestController {

@AutowiredprivateHttpServletRequest 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接受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来处理。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值