Home  >  Article  >  Web Front-end  >  How to understand Content-Type in HTTP

How to understand Content-Type in HTTP

一个新手
一个新手Original
2017-09-14 11:03:222494browse

0x01.About

View Restful API header plug-in: Chrome plug-in REST Console, and tool for sending Restful API: Chrome plug-in POST Man

In the HTTP 1.1 specification, HTTP request methods include OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

Usually we only use GET and POST, but for Restful According to the API specification, the PUT method should be used to request resources, and the DELETE method should be used to delete resources.

For example, send a DELETE packet:

http://example.com/my/resource?id=12345

Then the information can be obtained through the id. This packet only has a header and does not have a body. Let’s discuss some of the following: The body transmission format of the package.


0x02.Content-Type

Content-Type is used to specify the content type, which generally refers to the Content-Type that exists in the web page. The Content-Type attribute specifies the HTTP request and response. Content type. If ContentType is not specified, it defaults to text/html.

There is a configuration file mime.types in nginx, which is mainly the file format indicating Content-Type.

The following are several common Content-Types:

1.text/html
2.text/plain
3.text/css
4.text/ javascript
5.application/x-www-form-urlencoded
6.multipart/form-data
7.application/json
8.application/xml
...

The first few are easy to understand. They are all file types of html, css, and javascript. The last four are POST delivery methods.


0x03.application/x-www-form-urlencoded

application/x-www-form-urlencoded is a commonly used form delivery method, ordinary Form submission, or js package delivery, is done in this way by default.

For example, if a simple form is:

<form enctype="application/x-www-form-urlencoded" action="http://homeway.me/post.php" method="POST">
    <input type="text" name="name" value="homeway">
    <input type="text" name="key" value="nokey">
    <input type="submit" value="submit">
</form>

, then the raw header received by the server will be similar to:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflateAccept-Language:zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,gl;q=0.2,de;q=0.2Cache-Control:no-cacheConnection:keep-aliveContent-Length:17Content-Type:application/x-www-form-urlencoded

Then the raw body received by the server will be, name=homeway&key=nokey. In PHP, data in array form can be obtained through $_POST.


0x04.multipart/form-data

multipart/form-data用在发送文件的POST包。

这里假设我用python的request发送一个文件给服务器:

data = {    
"key1": "123",    
"key2": "456",
}
files = {&#39;file&#39;: open(&#39;index.py&#39;, &#39;rb&#39;)}
res = requests.post(url="http://localhost/upload", method="POST", data=data, files=files)
print res

通过工具,可以看到我发送的数据内容如下:

POST http://www.homeway.me HTTP/1.1Content-Type:multipart/form-data; boundary=------WebKitFormBoundaryOGkWPJsSaJCPWjZP
------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key2"456------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="key1"123------WebKitFormBoundaryOGkWPJsSaJCPWjZP
Content-Disposition: form-data; name="file"; filename="index.py"

这里Content-Type告诉我们,发包是以multipart/form-data格式来传输,另外,还有boundary用于分割数据。

当文件太长,HTTP无法在一个包之内发送完毕,就需要分割数据,分割成一个一个chunk发送给服务端,

那么--用于区分数据快,而后面的数据633e61ebf351484f9124d63ce76d8469就是标示区分包作用。


0x05.text/xml

微信用的是这种数据格式发送请求的。

POST http://www.homeway.me HTTP/1.1 
Content-Type: text/xml<?xml version="1.0"?><resource>
    <id>123</id>
    <params>
        <name>
            <value>homeway</value>
        </name>
        <age>
            <value>22</value>
        </age>
    </params></resource>

php中$_POST只能读取application/x-www-form-urlencoded数据,$_FILES只能读取multipart/form-data类型数据,

那么,要读取text/xml格式的数据,可以用:

$file = fopen(&#39;php://input&#39;, &#39;rb&#39;);
$data = fread($file, length);
fclose($file);

或者

$data = file_get_contents('php://input');


0x06.application/json

Send data to the server in json format. At first, I tried to send the application/json format to the server through curl. package,

However the data I received is as follows:

------------------------- -e1e1406176ee348a Content-Disposition: form-data; name="nid" 2 --------------------------e1e1406176ee348a Content-Disposition: form-data ; name="uuid" cf9dc994-a4e7-3ad6-bc54-41965b2a0dd7 --------------------------e1e1406176ee348a Content-Disposition: form-data; name="access_token" 956731586df41229dbfec08dd5d54eedb98d73d2 --------- ------------------e1e1406176ee348a--

After thinking about it, I realized that there is no so-called json in HTTP communication, but string conversion It just becomes json, that is, application/json can be understood as text/plain, a normal string.

The reason why there are so many messy things-------It should be that the PHP array is transferred in, and there is a conversion problem

The above is the detailed content of How to understand Content-Type in HTTP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn