关于application/x-www-form-urlencoded等字符编码的解释说明
在Form元素的语法中,EncType表明提交数据的格式 用 Enctype 属性指定将数据回发到服务器时浏览器使用的编码类型。 下边是说明: application/x-www-form-urlencoded: 窗体数据被编码为名称/值对。这是标准的编码格式。 multipart/form-data: 窗体数据被编码为一条消息,页上的每个控件对应消息中的一个部分。 text/plain: 窗体数据以纯文本形式进行编码,其中不含任何控件或格式字符。
补充
form的enctype属性为编码方式,常用有两种:application/x-www-form-urlencoded和multipart/form-data,默认为application/x-www-form-urlencoded。 当action为get时候,浏览器用x-www-form-urlencoded的编码方式把form数据转换成一个字串(name1=value1&name2=value2...),然后把这个字串append到url后面,用?分割,加载这个新的url。 当action为post时候,浏览器把form数据封装到http body中,然后发送到server。 如果没有type=file的控件,用默认的application/x-www-form-urlencoded就可以了。 但是如果有type=file的话,就要用到multipart/form-data了。浏览器会把整个表单以控件为单位分割,并为每个部分加上Content-Disposition(form-data或者file),Content-Type(默认为text/plain),name(控件name)等信息,并加上分割符(boundary)。
通过HTTP模拟GET或POST请求,提交数据到服务端获取响应,比较常见些;但如上传文件到服务端,使用html form当然简单了,而因环境所限有时需要使用模拟方法去提交有附件(文件上传)的表单。我们暂且不说如何去模拟数据,通过一个简单的form看看当请求发生时,客户端提交了什么样的数据给服务端。
下面是一个简单的html form,两个文本输入框,一个文件上传(这里我选择一张图片),注意有文件上传的form的enctype属性。
2 <input id="Text1" name="content" type="text"/><br />
3 <input id="Text2" name="uploadImg" type="text"/><br />
4 <input id="File1" type="file" name="image0"/><br />
5 <input id="Submit1" type="submit" value="submit"/>
6 </form>
为了查看表单提交时,向服务端post了什么数据,这里我使用Fiddler来查看。Fiddler确实是个不错的工具,注意当url主机地址是localhost时Fiddler捕获不到,需要再localhost后加一点(.)即可,打开Fiddler,浏览带上面form的page,输入数据提交,此时在Fiddler中可看到post的数据了。下面是一部份数据的截图。
分析其中的数据不难得出,一个表单中的数据域(input type="text")对应的格式为
Content-Disposition: form-data; name="content"
this is a txt value
一个文件(input type="file")对应的格式为(通常为表单最后一个参数)
Content-Disposition: form-data; name="image0"; filename="E:\CAI\875.jpg"
Content-Type: image/pjpeg
[文件内容]
结尾处是-----------------------------7da119c1004a6--
有了上面的数据做参考,按照其格式组织数据,post到服务端,同样可以达到html form提交的效果。要特别注意其格式:如回车换行,差一个都可能得不到正确的响应,还有请求的Content-Length一定计算对。下面是一个参考:
{
string boundary ="---------------------------"+ DateTime.Now.Ticks.ToString("x");
//请求
WebRequest req = WebRequest.Create(@"http://localhost.:4944/WebSite1/getfile.aspx");
req.Method ="POST";
req.ContentType ="multipart/form-data; boundary="+ boundary;
//组织表单数据
StringBuilder sb =new StringBuilder();
sb.Append("--"+ boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"content\"");
sb.Append("\r\n\r\n");
sb.Append(v1);
sb.Append("\r\n");
sb.Append("--"+ boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"uploadImg\"");
sb.Append("\r\n\r\n");
sb.Append("v2");
sb.Append("\r\n");
sb.Append("--"+ boundary);
sb.Append("\r\n");
sb.Append("Content-Disposition: form-data; name=\"image0\"; filename=\"e:\\a.jpg\"");
sb.Append("\r\n");
sb.Append("Content-Type: image/pjpeg");
sb.Append("\r\n\r\n");
string head = sb.ToString();
byte[] form_data = Encoding.UTF8.GetBytes(head);
//结尾
byte[] foot_data = Encoding.UTF8.GetBytes("\r\n--"+ boundary +"--\r\n");
//文件
FileStream fileStream =new FileStream(file, FileMode.Open, FileAccess.Read);
//post总长度
long length = form_data.Length + fileStream.Length + foot_data.Length;
req.ContentLength = length;
Stream requestStream = req.GetRequestStream();
//发送表单参数
requestStream.Write(form_data, 0, form_data.Length);
//文件内容
byte[] buffer =new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
int bytesRead =0;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) !=0)
requestStream.Write(buffer, 0, bytesRead);
//结尾
requestStream.Write(foot_data, 0, foot_data.Length);
requestStream.Close();
//响应
WebResponse pos = req.GetResponse();
StreamReader sr =new StreamReader(pos.GetResponseStream(), Encoding.UTF8);
string html = sr.ReadToEnd().Trim();
sr.Close();
if (pos !=null)
{
pos.Close();
pos =null;
}
if (req !=null)
{
req =null;
}
return html;
}
相关推荐
在Web开发中,当涉及到通过HTTP协议向服务器发送POST请求时,我们经常需要选择不同的数据编码类型,主要是`application/x-www-form-urlencoded`和`multipart/form-data`。这两种编码方式各有其适用场景,主要取决于...
如果需要上传文件或处理复杂的数据结构,就需要使用multipart/form-data编码格式,而不是application/x-www-form-urlencoded。 application/x-www-form-urlencoded是HTML表单提交时使用的最常见的编码格式,它广泛...
通常前端通过POST请求向服务器端提交数据格式有4中,分别是”application/x-www-form-urlencoded”格式、” multipart/form-data”格式、”application/json”格式和”text/xml”格式。通常最常见的是”application/...
互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术,人工智能互联网资讯,技术简介,IT、AI技术...
值得一提的是,在HTML中,表单上传文件时必须设置其enctype属性为multipart/form-data,因为默认值是application/x-www-form-urlencoded,这不支持文件上传。 JavaScript中,XMLHttpRequest Level 2引入了FormData...
本篇文章主要讨论的是HTTP POST请求体中的数据格式,特别是`multipart/form-data`和`application/x-www-form-urlencoded`两种常见类型。 1. `multipart/form-data` `multipart/form-data`是HTTP协议中用于上传包含...
`application/x-www-form-urlencoded`适合简单的键值对数据,`multipart/form-data`适用于文件上传,而`application/json`和`application/xml`则更适合复杂的数据结构和前后端之间结构化的数据交换。在实际开发中,...
multipart/form-data主要是为了解决application/x-www-form-urlencoded编码格式在传输大量二进制数据或包含非ASCII字符文本时的低效问题。multipart/form-data的数据由多个part组成,part间通过boundary分隔符进行...
或 multipart/form-data。为二进制数据使用 多重编码 是否幂等 幂等 非幂等 HTTP方法 2、GET和POST比较 GET POST 长度限制 http协议没有限制,但是实际浏览器或服务 器有(最大2048) 理论上没有,可能会收到服务器...
contentType: "application/x-www-form-urlencoded; charset=GBK", // headers:{"ClientCallMode" : "ajax"},//添加请求头部 enctype="multipart/form-data" success: function(data){ if(data.msg=="success...
Request Payload则常用于JSON或其他自定义格式的数据提交,其Content-Type可能是`application/json`、`multipart/form-data`等。相较于Form Data,Request Payload更灵活,可以处理复杂结构的数据,比如对象或数组。...
内容类型:application / x-www-form-urlencoded webbench-发布内容--header header1:value1 --header header2:value2 -t time -c数字 2.Content-Type:multipart / form-data; boundary = random_bytes_or_...
网络连接, “POST”, “/submit.php”, .post_data, “Content-Type: application/x-www-form-urlencoded”) ``` 4. **处理响应**:`发送HTTP请求`会返回服务器的响应,可以使用“读取网络流”命令读取响应内容。...
post数据,是直接在http协议头将Content-Type设为application/x-www-form-urlencoded,这样服务器会将提交的数据,当作表单数据处理。发送的数据格式也为:userid=lilu&data=post图片类&name=天漏客。而post图片则是...
post数据,是直接在http协议头将Content-Type设为application/x-www-form-urlencoded,这样服务器会将提交的数据,当作表单数据处理。发送的数据格式也为:userid=lilu&data=post图片类&name=天漏客。而post图片则是...
在服务器设置中,仅启用响应格式化程序json来解析mime类型application/json , application/x-www-form-urlencoded和multipart/form-data的请求。 一个Javascript项目-node.js或Titanium已知可以工作。 安装 ...
5. `application/*`开头的类型,例如`application/xhtml+xml`(XHTML格式)、`application/xml`(XML数据格式)、`application/atom+xml`(Atom XML聚合格式)...-stream`(二进制流数据)以及`application/x...
application/x-www-form-urlencoded application/json , text/plain 从模型构建HTTP请求/响应原始消息: 方法,协议,协议版本/状态码,原因 查询参数 标头 饼干 正文,支持以下contentTypes: multipart/...