提交POST请求的四种方法
web浏览器、服务器和相应的web应用程序都是通过HTTP协议相互通信的。HTTP使用的是可靠的数据传输协议,它能够确保数据在传输的过程中不会被损坏或产生混乱。Http请求方式有多重,最近遇到了关于post的一些问题,所以这里专注了解下post提交数据的几种方式。
HTTP应用程序发送的数据块就是HTTP报文,它以一些文本形式的元信息开头,这些元信息描述了报文的内容及含义。后面跟着可选的数据部分。
所有HTTP的报文可以分为两类:请求报文(request message)和响应报文(response message)。请求报文会向web服务器请求一个动作,响应报文会将请求的结果返回给客户端。请求报文和响应报文的基本报文结构相同。
请求报文结构:
123
响应报文结构:
123
HTTP协议规定POST提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须使用什么样的编码方式,所以开发者可以自主定义消息体的格式,只要最后发送的HTTP请求满足上面的格式就可以。
但是,数据发送出去后,还需要服务端可以解析成功才有意义。一般服务端的语言和框架都可以正常解析常见的数据格式。服务端通常是根据请求头(headers)中的Content-Type字段来获得请求中的消息主题是用何种方式编码,再对主题进行解析。所以POST提交数据的方式,主要是Content-Type和消息主体编码的方式。
application/jsonjson的请求头基本上已经很常见了。它用来告诉服务端消息主体是序列后的json字符串。由于JSON规范的流行,除了低版本的IE之外各大浏览器都原生支持JSON.stringify,服务端语言也都有处理JSON的函数。一些框架都已经默认支持了。
它的好处是,可以直接用json传输结构化的数据,相比其他只能键值对的传输方式,这一点非常有用。顺便说一句,现在Angular里面默认支持的传输方式直接是application/json,可以直接使用。例如:
1234567891011121314constructor( private http: HttpClient,) { this.http.post('http://baidu.com', { a: 1, c: { d: 5, e: 6, } }).subscribe(res => { console.log('res', res); });}
直接调用httpClient来发起一个请求,直接使用json传递参数,服务端可以直接获取json数据。
application/x-www-form-urlencoded浏览器的原生