技术标签: 日常开发小问题 参数传递 json格式 contentType springMVC
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported
前端代码:
$.ajax({
type:"post",
url:"/test",
data:JSON.stringify({id:1,name:"小明",gender:true}),
success:function (result) {
console.log(result);
}
});
后端代码:
@ResponseBody
@RequestMapping("/test")
public Object testJson(@RequestBody User user){
System.out.println(user);
return user;
}
前后端用json字符串做数据交互。一运行就报了上面的异常了。
先说一下解决方法:
ajax中加上一个键值对:contentType:"application/json" 就行了。
原因:前端用 JSON.stringify({id:1,name:"小明",gender:true}) 将一个js对象转换成了json字符串,后端通过@RequestBody注解表示要解析json字符串(相当于fastJson来解析json字符串)并赋值给User对象,我们发送的是http请求,后端在解析请求参数时并不是直接解析内容,若是post请求的话,他会先检查HTTP请求的Content-type属性值,根据这个属性值来判断请求体中的数据格式。前端我们发的ajax请求默认的contentType属性值为:application/x-www-form-urlencoded;charset=UTF-8,这个contentType表示的数据格式是键值对格式。所以我后端需要json格式的数据,你给我传递个键值对格式,我肯定说不支持啊。
所以我们用contentType:"application/json"来改变http请求,表示我发送的数据是json格式的,后端就可以识别了呗。
常见场景
1)form表单默认MIME类型时
2)serialize()方法
3)ajax中的js对象(根据ajax文档显示,最终js对象在发送时会被转化成键值对格式)
4)get请求
5)FormData对象
4.Json格式:{"name":"www","url":"www","checked":true,"pId":6}
data:JSON.stringify({name:name,url:url,checked:checked,pId:pId}), //将js对象转换成json字符串格式
contentType:"application/json" //设置请求的MIME类型为application/json格式,即json格式
5.请求体的区别:Form data 和Request Payload
1、当post请求的content-Type属性的值为application/x-www-form-urlencoded; charset=UTF-8时,数据封装在Form data中,键值对格式
2、当post请求的content-Type属性的值为application/json或text/plain时,数据封装在Request Payload中,json格式
1、只要保证请求的参数名和处理器方法的形参名称一致,自动绑定成功。
2、获取单个请求参数
1)@RequestParam注解:获取一个请求参数,并赋值给一个形参
属性
@RequestParam(value="password",required=false,defaultValue="0") int password
required:设置属性是否为必须的,默认为true。可以设置其值为false,即当没有该属性时也不会报错。
defaultValue:当required=false时使用,设置请求参数的默认值,不能单独使用。
2)@PathVariable 注解:针对rest风格的url,可以将url的占位符参数,绑定到处理器方法的入参处
<a href="/springmvc/testPathvariable/12/tom">testPathvariable</a>
@GetMapping("/testPathvariable/{id}/{name}")
public String testPathVariable(@PathVariable("id") Integer id,@PathVariable("name") String name) {
System.out.println(id);
return "success";
}
这里说一下rest风格的URL,rest风格的URL强调用不同的请求方式代表服务器端不同的操作,可以大致概括为服务器端的增删改查四个操作,即get请求代表查询、post请求代表增加、put请求代表更新、delete请求代表删除。但是在传递参数上面,键值对的参数格式也完全适用于rest风格的URL,比如说对应post的添加请求,前端将参数封装在请求体中,后端完全可以像以前一样,使用一个对象来接收参数,我曾经见过一个据说采用rest风格URL的项目中所有的请求方式全是post,这样完全可以进行操作,只是不太符合rest强调的优雅的URL的风格,而且要知道,post请求是要比get请求慢的,这一点感兴趣的可以自行百度。所以,总结来说,rest风格的URL也就两种传参方式:一种是像这样 /testPathvariable/user/1,后端就用占位符+@PathVariable("参数名")来接收参数,一般适用于get请求和delete请求,当然参数较多时,可以考虑适用post请求将参数封装到请求体中发送;另一种是像之前一样,在请求体中使用键值对格式,后端用对象或者多个参数来接收,只要保证键值对的参数key和入参的参数名一致就行。
目前,rest风格的URL还没有普及开来,前后端对接时大部分还是使用键值对或传递json字符串的形式,不过因为微服务和springCloud的流行,springCloud默认的服务调用组件ribbon,默认就是采用rest风格的URL来进行服务调用的,不过这种URL都是在各服务的内部进行调用,用户是看不到这种URL的。
3)@RequestHeader注解:获取请求头中的参数。
如:@RequestHeader(value="Accept-Language") 这是获取请求头中Accept-Language属性的值。
4)@CookieValue注解:获取cookie中某个键值对的值。
@CookieValue("JSESSIONID")获取JSESSIONID属性的值。
3、获取多个请求参数
使用POJO(普通的Java类)作为参数:按照请求参数名(name属性名)和POJO属性名进行自动匹配,自动通过setter方法为该对象填充属性值,且支持级联属性。
1.@RequestBody User user(推荐)
用实体类接收,json的key要和实体类属性一致。
2.@RequestBody Map<String,Object> map(次推荐)
用map接收,json的key要和map的key一致
3.@RequestBody String str (这样是将整个json字符串赋值给str,不推荐)
用字符串接收,然后在自己解析json字符串
ok,结束,吃饭去。
文章浏览阅读1k次。前言:http是一种无状态的协议,无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。cookie:由于http无状态这个特点,导致了一些麻烦,比如:你登录csdn(当然是比如),每次都要重新输入用户名和密码,这样就很不方便,你刷新一下页面,又叫你登录。针对这个问..._java 后端跟session
文章浏览阅读1.1k次,点赞2次,收藏6次。本地的代码修改后,想要放弃本地修改,然后拉取代码。1. 未使用git add 缓存代码使用git checkout -- filename,注意中间有--git checkout -- filename放弃所有文件修改 git checkout .git checkout .此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除 此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,所以对git来说是未知,只需..
文章浏览阅读530次。1 A+Bimport java.util.Scanner;/** * Created by m1786 on 2017/3/3. */public class Main{ public static void main(String args[]){ int a,b; Scanner sc=new Scanner(Sy
文章浏览阅读807次。机器学习笔试题
文章浏览阅读958次。error C4430: missing type specifier - int assumed. Note: C++ does not ...(转) 2011-07-06 23:37:58| 分类:编程 |举报|字号 订阅AdapterBase.cppWINVER not defined. Defaulting to 0x0502 (Wi
文章浏览阅读9.2k次,点赞11次,收藏56次。wx.chooseImage({ // count: 1, // 默认9 sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: function (res) { // 返回选定照片的本地文件路径列表,tempFilePath可以_扫码上传图片到指定服务器
文章浏览阅读1.3k次。一、Objective-C(以下简称OC)简介 Objective-C 是在 C 的基础上,加入面向对象特性扩充而成的通用型高级编程语言,也写作 ObjC 、Obj-C 和较少用的 Objective C。Objective-C主要应用于 Mac OS X 和 iOS 系统及其相关 API 如Cocoa、Cocoa Touch。Objective-C 最_objective-c语言概述与应用分享
文章浏览阅读590次。802.11ax的由来 IEEE 802.11是无线网络通信的标准中负责无线局域网的协议标准的工作组。IEEE已成功指定了数个WLAN协议,如11g、11n及11ac。 802.11ac成功的将WLAN的链接速率突破到1Gbps,但随着WLAN在市面上的普及,AP和无线终端越来越多,设备间互相干扰导致整网的效率不理想;多种应用场景的增加,如视频网站、物联网等,在吞吐量、丢包、稳定性、时..._11ax使用he的由来
文章浏览阅读550次。答:选择不同的基对应的坐标值就会不同,如果坐标值改变了,那么相应的矩阵也会做相应的更改。变换是映射,它将一个事物对应成另一个事物,在所有映射中,满足线性条件的映射叫做线性变换。,如果进行了线性变换,那么变换前后各点的距离相等关系是不变的。旋转可以用一个矩阵来表示,属于左乘一个矩阵的情况,故为线性变换。步骤是,取输入基,进行进行线性变换,事实上,所有线性变换都可以用一个矩阵来表示。,前面讨论过,左乘一个矩阵是一个线性变换。,对应的输出基没有可以表示这个的基,故为。根据概念,它不是一个线性变换,因为。_线性变换矩阵
文章浏览阅读589次。最近手头的项目报内存溢出错误,内存溢出(Out Of Memofy)简称为传说中的OOM。^_^ 网上找资料学习了下JAVA_OPTS参数和配置,应用到生产环境,没有再报错。错误信息:Java.lang.OutOfMemoryError: Java heap space测试环境:RHEL5.4_x64jdk-6u20-linux-x64.binapache-tomcat-6.0_using catalina_opts参数配置
文章浏览阅读3.5k次。分析的时候ALT中出现了*,(如下)懵逼。#CHROM POS ID REF ALT QUAL FILTER INFO FORMATchr9 10105 rs575580161 C *,A 180.66 VQSRTrancheSNP99.50to99.90 AC=3,2;AF=1.280e-03,8.532e-4;AN=2344;DB;DP=1886;ExcessHet=0;FS=0;InbreedingCoeff=0.331;MQ=40.98;NEGATIVE_TRAIN_SITE;PG=0,28
文章浏览阅读2.7k次,点赞2次,收藏17次。目 录:1. 小程序自动化方案 1.1 小程序的基本构成 1.2 原生组件定位之UiSelector 1.2.1 原生组件定位之UiSelector 1.2.2 web元素定位 1.3 小程序自动化准备 1.3.1 安装appium 1.3.2 安装adb tools 1.3.3 chromedriver.exe版本 1.3.4..._百度小程序自动化测试