赞
踩
埋下一个伏笔,有空整理下HTTP相关的内容。
HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 这几种。其中 POST 一般用来向服务端提交数据,本文主要讨论 POST 提交数据的几种方式。
我们知道,HTTP 协议是以 ASCII 码传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:请求行、请求头、消息主体,http协议规定post提交的数据,必须包含在消息主体中entity-body中,但是协议并没有规定数据使用什么编码方式。开发者可以自己决定消息主体的格式。
我们日常开发中进行网络请求的时候,比如说借助网络请求框架(OKHttp3、Retrofit、HttpClient[Apache])进行请求的时候,都是借助已经封装好的API,只需在请求前对请求头和请求方法进行一些简单的设置,就能完成一个http请求。POST 提交数据方案,包含了 Content-Type 和消息主体编码方式两部分。下面就正式开始介绍它们。
Content-Type属性就位于http请求头部,它用来指明请求体的消息类型(MIME),从而是服务器能够根据类型编码使用特定的解析方式解析数据。
application/x-www-form-urlencoded 是post请求标准编码格式,post下默认ContentType类型,原生form表单enctype属性如果未声明,也是该类型。支持GET/POST等方法,所有数据变成键值对的形式key1=value1&key2=value2的形式,可以通过request.getParameter(“key”)提取出参数值,并且特殊字符需要转义成utf-8。
默认的提交方式是 application/x-www-form-urlencoded 编码提交数据的,在chrome的network面板下,默认的请求体是被解析的。展示成formData的形式;
如上默认提交的 contentType为 application/x-www-form-urlencoded,此时提交的数据将会格式化成:
fname=kongzhi&age=30;
如果请求类型type是GET的话,那么格式化的字符串将直接拼接在url后发送到服务端; 如果请求类型是POST, 那么格式化的字符串将放在http body的Form Data中发送。
使用表单上传文件时,比如<form>
标签必须指定表单的 enctype属性值为 multipart/form-data,相应的Content-Type属性也被设置同样的,只不过它的Content-Type格式为
Content-Type: multipart/form-data; boundary=${bound}
请求体被分割成多部分,每部分使用 --boundary分割。为什么要有boundary,boundary的好处主要体现在当用户上传文件的同时还能传递其他数据(比如文本),而这些文本数据就可以用boundary进行分隔。
Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。Content-disposition其实可以控制用户请求所得的内容存为一个文件的时候提供一个默认的文件名,通过inline
||attachment
可以设置文件是直接在浏览器上显示还是在访问时弹出文件下载对话框。
文件名可以在Content-Disposition中获取,这取决于后端接口的编写。
注:在chrome浏览器中,将Content-Disposition响应头设置为inline
||attachment
没有多大区别,都是将文件下载处理,但是在Intenet Explore上inline
下的文件,如果能被浏览器正常解析的比如png,avi则可以直接显示,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。