HTTP请求中的form data和js request formdatapayload的区别

Posts - 189,
Articles - 7,
Comments - 5
没钱上进,有钱任性。-
"身处这个行业,半年不学习就该失业了!必须不断学习新知识。"
10:56 by Benoly, ... 阅读,
Ajax Post请求下的Form Data和Request Payload
通常情况下,我们通过Post提交表单,以键值对的形式存储在请求体中。此时的reqeuest headers会有Content-Type为application/x-www-form-urlencoded 的实体头字段来标明当前的表单数据的内容形式,在Chrome F12下的Form Data中可以查看到。
而如果直接使用XmlHttpRequest Post提交,除非手动添加头Content-Type:application/x-www-form-urlencoded, 发送的表单参数不会Form Data中,而是在存储在Request Payload中, 这和文件上传的情况是一致的,不同是请求头Content-Type不同。前者默认是text/plain,后者是multipart/form- boundary=----WebKitFormBoundaryIQTaiWwGiqjLQYUB。
那么,什么是Request Payload? 在了解Payload这个术语前,还需了解以下几个术语:
消息(Http Message)
http中定义了2种消息,Request和Response消息。
Request (section 5) and Response (section 6) messages use the generic
message format of RFC 822 [9] for transferring entities (the payload
of the message). Both types of message consist of a start-line, zero
or more header fields (also known as &headers&), an empty line (i.e.,
a line with nothing preceding the CRLF) indicating the end of the
header fields, and possibly a message-body.
实体(Entity)
The information transferred as the payload of a request or
response. An entity consists of metainformation in the form of
entity-header fields and content in the form of an entity-body, as
described in section 7.
信息被作为请求或响应的有效负荷被传递。通俗的说就是,实体是指作为请求或者响应消息的有效载荷而传输的信息。
例如,当用户想浏览某个Web页面时,HTTP请求消息种的请求方法,响应消息中的状态码都不是有效载荷,它们都是为了实现文件下载这一最终目的而在客户于服务器之间传送的额外消息:而用户所要浏览的HTML文件及其元消息(文件大小,最近修改时间等)才是有效载荷。
有效载荷(Payload)
通过前面的http定义可以了解到什么是payload。
请求request消息或响应response消息中可能会包含真正要传递的数据,这个数据我们就称为消息的有效负荷,对应着就是request payload,response payload。
知道了什么是Request Payload,那服务端是如何接收并解析出我们通过Request Payload所传递的特殊格式的数据呢(比如表单键值对参数或复杂的json对象)?
一般服务端程序会根据头字段中的Content-type的值来做特定的处理,如x-www-form-urlencoded。有说到如何在java servlet里通过扩展来处理request payload的形式的参数。
那么ASP.NET 里又是怎样处理的呢?是否也需要我们自行扩展呢?
我们知道XmlHttpRequest.send()默认不设置content-type头字段,服务器一般默认为text/plain。如果我们发送复杂的json格式的情况下,应该手动设置为application/json,这样通过在服务端程序中根据该字段进行相应的处理和解析,从而使数据可以在服务端正确解析称为可能。
回到ASP.NET WEB API中,有各种自定义的方式类解析复杂类型的数据,且不限于json格式。request payload,POST提交数据,如何在header信息中显示出这样的payload格式?_百度知道
request payload,POST提交数据,如何在header信息中显示出这样的payload格式?
header信息中包含下图部分:
我希望只出先中间花括号的json数据,上下两个框内的数据都去掉。
Wechat API
用form表单提交总是带上下两个框内数据。
而ajax方法倒是可以实现不带两个框的数据,但是是异步请求,存在跨域问题,不能向form表单那样,action到另外...
我有更好的答案
你这form表单是上传附件了吗?在form表单中加上 enctype=&multipart/form-data& 这个属性是就会出去你那种情况,如果你表单不需要上传附件,就把这个属性去掉应该就可以了。
去掉 enctype=&multipart/form-data&,头部信息出现的是 Form Data
而不是Request payload
为您推荐:
其他类似问题
payload的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在下面的例子中,表单数据会在未编码的情况下进行发送:
&form action=&form_action.asp&&enctype=&text/plain&&&&p&First name: &input type=&text& name=&fname& /&&/p&&&p&Last name: &input type=&text& name=&lname& /&&/p&&&input type=&submit& value=&Submit& /&&&/form&
定义和用法
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。
默认地,表单数据会编码为 &application/x-www-form-urlencoded&。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 &+& 加号,特殊符号转换为 ASCII HEX 值)。
enctype值和意义:
application/x-www-form-urlencoded&&&&&&&& 在发送前编码所有字符(默认)
multipart/form-data&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值。
text/plain&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 空格转换为 &+& 加号,但不对特殊字符编码。
HTTP请求中,如果是get请求,那么表单参数以name=value&name1=value1的形式附到url的后面,如果是post请求,那么表单参数是在请求体中,也是以name=value&name1=value1的形式在请求体中。通过chrome的开发者工具可以看到如下(这里是可读的形式,不是真正的HTTP请求协议的请求格式):
RequestURL:
Request Method:GET
Status Code:200 OK
Request Headers
Accept:text/html,application/xhtml+xml,application/q=0.9,image/webp,**;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,q=0.8,q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Cache-Control:max-age=0
Connection:keep-alive
Content-Length:25
Content-Type:application/x-www-form-urlencoded
Cookie:JSESSIONID=74AC93F9FFC10474CD8EDD8D
Host:127.0.0.1:8080
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0. Safari/537.36
name:mikan
address:street
Response Headers
Content-Length:2
Date:Sun, 11 May :33 GMT
Server:Apache-Coyote/1.1
这里要注意post请求的Content-Type为application/x-www-form-urlencoded,参数是在请求体中,即上面请求中的Form Data。
而如果使用原生AJAX POST请求的话:
RequestURL:
Request Method:POST
Status Code:200 OK
Request Headers
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,q=0.8,q=0.6
AlexaToolbar-ALX_NS_PH:AlexaToolbar/alxg-3.2
Connection:keep-alive
Content-Length:28
Content-Type:text/charset=UTF-8
Cookie:JSESSIONID=C40CE7C6F7D2E687A0A89
Host:127.0.0.1:8080
User-Agent:Mozilla/5.0 (Windows NT 6.1)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0. Safari/537.36
Request Payload
name=mikan&address=street
Response Headers
Content-Length:2
Date:Sun, 11 May :23 GMT
Server:Apache-Coyote/1.1
注意请求的Content-Type为text/charset=UTF-8,而请求表单参数在RequestPayload中。
HTTP POST表单请求提交时,使用的Content-Type是application/x-www-form-urlencoded,而使用原生AJAX的POST请求如果不指定请求头RequestHeader,默认使用的Content-Type是text/charset=UTF-8。
所以,在使用原生AJAX POST请求时,需要明确设置Request Header,即:
xhr.setRequestHeader(&Content-Type&,&application/x-www-form-urlencoded&);
服务器为什么会对表单提交和文件上传做特殊处理,因为表单提交数据是名值对的方式,且Content-Type为application/x-www-form-urlencoded,而文件上传服务器需要特殊处理,普通的post请求(Content-Type不是application/x-www-form-urlencoded)数据格式不固定,不一定是名值对的方式,所以服务器无法知道具体的处理方式,所以只能通过获取原始数据流的方式来进行解析。
jquery在执行post请求时,会设置Content-Type为application/x-www-form-urlencoded,所以服务器能够正确解析,而使用原生ajax请求时,如果不显示的设置Content-Type,那么默认是text/plain,这时服务器就不知道怎么解析数据了,所以才只能通过获取原始数据流的方式来进行解析请求数据。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:28553次
排名:千里之外
原创:36篇
转载:20篇
(5)(18)(32)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'HTTP请求中的form data和request payload的区别_百度知道
HTTP请求中的form data和request payload的区别
我有更好的答案
你这form表单是上传附件了吗?在form表单中加上 enctype=&multipart/form-data& 这个属性是就会出去你那种情况,如果你表单不需要上传附件,就把这个属性去掉应该就可以了。
采纳率:95%
来自团队:
为您推荐:
其他类似问题
payload的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 payload formdata 的文章

 

随机推荐