4种常见的POST数据提交方式
2017-01-18 21:34
246 查看
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
1.第一种 application/x-www-form-urlencode
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置
application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样:
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。
2.第二种multipart/formdata
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让
<form> 表单的
multipart/form-data。
这种数据提交方式主要用来上传文件的。
3.第三种application/json
让前端在content-type 设置为application/json,然后提交参数用JSON.stringify将JS对象序列化。
后端在spring中可以用@RequestBody 注解,这样直接可以将参数反序列化到对象中。这种方式在RestFul接口用的多,用Json提交的有个好处是可以处理非常复杂的数据机构。如果按照第一种键值对的方式提交,工作量较大。
坑:单个变量String的时候,不能直接接受(默认是转成map的)。报错:
需要用非基础类型对象接收。
4.第四种text/xml
用的不多。
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。类似于下面这样:
1.第一种 application/x-www-form-urlencode
这应该是最常见的 POST 提交数据的方式了。浏览器的原生 <form> 表单,如果不设置
enctype属性,那么最终就会以
application/x-www-form-urlencoded 方式提交数据。请求类似于下面这样:
BASH[code]POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
首先,Content-Type 被指定为 application/x-www-form-urlencoded;其次,提交的数据按照 key1=val1&key2=val2 的方式进行编码,key 和 val 都进行了 URL 转码。
2.第二种multipart/formdata
这又是一个常见的 POST 数据提交的方式。我们使用表单上传文件时,必须让
<form> 表单的
enctype等于
multipart/form-data。
这种数据提交方式主要用来上传文件的。
3.第三种application/json
让前端在content-type 设置为application/json,然后提交参数用JSON.stringify将JS对象序列化。
后端在spring中可以用@RequestBody 注解,这样直接可以将参数反序列化到对象中。这种方式在RestFul接口用的多,用Json提交的有个好处是可以处理非常复杂的数据机构。如果按照第一种键值对的方式提交,工作量较大。
坑:单个变量String的时候,不能直接接受(默认是转成map的)。报错:
org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: java.io.PushbackInputStream@4b55110; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token at [Source: java.io.PushbackInputStream@4b55110; line: 1, column: 1]解决:
需要用非基础类型对象接收。
4.第四种text/xml
用的不多。
相关文章推荐
- 微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务
- RPC failed; result=22, HTTP code = 411
- springmvc实现url路由功能
- spring aop 无法代理父类方法 的解决方法
- Spring MVC过滤器-超类 GenericFilterBean
- 一个jar包里的网站
- 一个jar包里的网站之文件上传
- 一个jar包里的网站之返回对媒体类型
- Spring和ThreadLocal
- Spring Boot 开发微服务
- Spring AOP动态代理-切面
- HTTP Header 属性列表
- nginx中http核心模块的配置指令2
- nginx中http核心模块的配置指令3
- nginx中http核心模块的配置指令4
- nginx中http的fastcgi模块的配置指令1
- 使用MVC微信支付返回get_brand_wcpay_request:fail