【请求之密】payload和formData有什么不一样?

最近作项目的时候,在经过post请求向服务端发送数据的时候,请求失败了。错误信息以下:jquery

返回的400(bad request)错误,说明客户端这边发送的请求是有问题的。ajax

和经过jquery中的ajax方法发送的请求做对比。发现问题出在了请求的主体部分。json

 

这里的请求主体部分是payload的形式的。app

 

 而直接经过jq,是以下这种formdata形式。post

 

formData是什么?

 formData是客户端主体部分组装数据的一种方式,当咱们使用:fetch

  1. method='POST'提交一个HTML-Form表单
  2. 如上图中黄色部分的content-Type:application/x-www-form-urlencoded
  3. content-Type:multipart/form-data

这三种方式去提交请求主体的时候,就是formData形式。url

将如上的请求简写一下:spa

起始行:POST /getProduct HTTP/1.1 首部: Content-Type: application/x-www-form-urlencoded
 主体1:productId=3189 单参 主体2:productId=3189&orderId=145 多参

主体的形式会有两种,在多参数的状况下,和get请求同样,是用&进行链接的。code

$.ajax({ url : '/v2/product/getProductProp', data :{ 'productId' :proid, }, type: 'post', }) .then(function(data) { //TODO
}) .fail(function() { that.fetchDataFailed(); }) .done(function() { //TODO 
});    

 

在jq的ajax模块中,contentType的默认是使用的formData发送主体的。既然如此的话,咱们就经过传入自定义的contentTypeorm

$.ajax({ url : '/v2/product/getProductProp', data :{ 'productId' :proid, }, type: 'post', contentType:'application/json' //注意这里的不一样
}) .then(function(data) { //TODO
}) .fail(function() { that.fetchDataFailed(); }) .done(function() { //TODO 
});  

 

是的,咱们确实成功的修改了formData的提交形式,变成了payload.

 

payload是什么?

payload是一种以JSON格式进行数据传输的一种方式。

http可能会传输payload,若是不限制其请求的方式(那么请求的方法就是OPTIONS)或者响应的状态码,其包含元数据,头部区域和数据。

若是数据是经过正常的put或者post方法发送的,那么payload就是一个http请求起始行紧接一个CRLF后面的那一部分。

起始行:POST /getProduct HTTP/1.1 首部: Content-Type: application/json
 主体1:{"productId":3189} 单参 主体2:{"productId":3189,"orderId":145} 多参

一样的,咱们能够将payload形式的参数。经过formData()来组装。

 经过formData()组装后的数据就像表单数据同样,变成了键/值对的形式。

小结

  • 首部属性contentType能够改变请求的数据提交方式:application/json(payload),application/x-www-form-urlencoded(formData)
  • 服务端的响应方式决定客户端的提交方式
  • 使用formData()能够经过payload提交表单数据:multipart/form-data
相关文章
相关标签/搜索