HTTP请求方法POST的几种提交数据的方式

版权声明:本文为博主原创文章,商业转载请联系作者获得授权,非商业转载请注明出处。 https://blog.csdn.net/liitdar/article/details/86157758

本文主要介绍HTTP请求方法POST的几种提交数据的方式。

1 概述

HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT,其中 POST 方法一般用于向服务端提交数据

HTTP 是建立在 TCP/IP 协议之上的应用层协议,协议规定传输的内容的格式为 ASCII 码。另外,HTTP 协议把 HTTP 请求分为三个部分:状态行、请求头、消息主体。请求消息的结构类似下面格式:

<request-method> <request-URL> <http-version>
<headers>

<body>

HTTP 协议规定 POST 提交的数据必须放在消息主体(body)中,但并没有规定这些数据的编码方式,所以,开发者可以根据实际情况选择消息主体的格式,只要保证最后发送的 HTTP 请求满足上面的格式就可以。

不过,在实际情况中,通过 HTTP 请求发送给服务端的数据,对服务端而言,必须能够成功地解析此请求数据,否则此 HTTP 请求是无意义的。常见的服务端语言(如 php、python 等)以及它们的 framework,都内置了自动解析常见数据编码方式的功能。服务端通常是根据请求头(headers)中的“Content-Type”字段,先确定 HTTP 请求的消息主体的编码方式,再根据该编码方式对消息主体进行解析。

这里展示一个请求消息的示例,如下:

POST http://api.gcdev.tfb8.com/cgi-bin/v2.0/api_merchant_agency_info_qry.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 78827c4a-9806-41d7-94b4-265fdd9d4c87
User-Agent: PostmanRuntime/7.4.0
Accept: */*
Host: api.gcdev.tfb8.com
accept-encoding: gzip, deflate
content-length: 129
Connection: keep-alive

api_ver=1.0.0&merchant_id=1800000464&busi_type=03&second_busi_type=02&trade_amt=000000000100&trade_time=2018-10-01%2000%3A00%3A00

在上面的HTTP请求示例中:

  • HTTP请求方法(request-method)为:POST
  • HTTP请求URL(request-URL)为:http://api.gcdev.tfb8.com/cgi-bin/v2.0/api_merchant_agency_info_qry.cgi
  • HTTP版本(http-version)为:HTTP/1.1
  • headers信息为:Content-Type......Connection: keep-alive。其中消息主体的编码方式为“application/x-www-form-urlencoded”
  • body信息为:api_ver=1.0.0......

下面分别介绍POST的几种提交数据的方式。

2 application/x-www-form-urlencoded

“application/x-www-form-urlencoded”是一种常见的 POST 数据提交的方式。对于浏览器的原生 <form> 表单,如果不设置“enctype”属性,那么其就会以“application/x-www-form-urlencoded”方式提交数据。

HTTP请求示例:

POST http://api.gcdev.tfb8.com/cgi-bin/v2.0/api_merchant_agency_info_qry.cgi HTTP/1.1
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
Postman-Token: 78827c4a-9806-41d7-94b4-265fdd9d4c87
User-Agent: PostmanRuntime/7.4.0
Accept: */*
Host: api.gcdev.tfb8.com
accept-encoding: gzip, deflate
content-length: 129
Connection: keep-alive

api_ver=1.0.0&merchant_id=1800000464&busi_type=03&second_busi_type=02&trade_amt=000000000100&trade_time=2018-10-01%2000%3A00%3A00

在上面的请求示例中:

  1. Content-Type 被指定为“application/x-www-form-urlencoded”类型;
  2. 请求提交的主体数据按照键值对(key1=value1&key2=value2)方式进行编码,其中 key 和 value 都进行了 URL 转码。

大部分服务端语言都对“application/x-www-form-urlencoded”数据提交方式有很好的支持。

3 multipart/form-data

“multipart/form-data”也是一个常见的 POST 数据提交的方式。当我们使用表单上传文件时,必须让 <form> 表单的 enctype 属性等于“multipart/form-data”。

HTTP请求示例:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA

------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"

title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/png

PNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

“multipart/form-data”类型的消息主体复杂一些:

  1. 首先,生成了一个 boundary 用于分割主体消息的不同字段;
  2. 然后,在 Content-Type 中确定了主体消息是以“multipart/form-data方式”来编码的,以及本次请求的 boundary 的具体内容。
  3. 同时,主体消息按照字段个数,又会分为多个结构类似的部分,每部分都是以“boundary”开始,紧接着字段信息(如传输内容是文本还是文件、以及具体的传输字段的具体值)。如果传输的内容是文件,还要包含文件名和文件类型信息。
  4. 最后,消息主体以“boundary--”结束。

“multipart/form-data”方式一般用来使用表单上传文件,各大服务端语言对这种方式都有着良好的支持。

说明:“application/x-www-form-urlencoded”和“multipart/form-data”这两种 POST 数据提交的方式,都是浏览器原生支持的。通过指定 <form> 元素的 enctype 属性,可以切换这两种方式。

4 application/json

由于 JSON 规范的流行,“application/json”方式也成为了常见的 Content-Type。实际上,现在越来越多的人使用这种方式发送 POST 请求,用来告诉服务端消息主体是序列化后的 JSON 字符串。现在除了低版本 IE 之外,各大浏览器对 JSON 的支持都很好,服务端语言也都有处理 JSON 的相关函数。

与通常的键值对相比,JSON 格式支持更复杂的结构化数据。

HTTP请求示例:

POST http://www.example.com HTTP/1.1 
Content-Type: application/json;charset=utf-8

{"class":"6","grade":"1","student_info":[{"name":"zhangsan","height":"170","age":"16","sex":"boy"},{"name":"lisi","height":"172","age":"16","sex":"boy"}]}

通过使用“application/json”方式,可以很方便的提交复杂的结构化数据。当前很多抓包工具(如 Chrome 自带的开发者工具、Fiddler 等)都会以树形结构展示 JSON 数据,非常友好,便于查询请求中的 JSON 数据。

说明:在实际应用中,JSON 字符串也可以作为 value,存放在键值对里,以 “x-www-form-urlencoded 或 multipart/form-data”方式进行数据提交。例如:可以将下列内容作为主体消息、使用“x-www-form-urlencoded”进行数据提交:

version=1.0&json_data={"class":"6","grade":"1","student_info":[{"name":"zhangsan","height":"170","age":"16","sex":"boy"},{"name":"lisi","height":"172","age":"16","sex":"boy"}]}

猜你喜欢

转载自blog.csdn.net/liitdar/article/details/86157758
今日推荐