Maison  >  Article  >  interface Web  >  Comment comprendre le type de contenu en HTTP

Comment comprendre le type de contenu en HTTP

一个新手
一个新手original
2017-09-14 11:03:222515parcourir

0x01.About

Afficher le plug-in d'en-tête de l'API Restful : plug-in Chrome REST Console et outil d'envoi d'API Restful : plug-in Chrome POST Man

Dans la spécification HTTP 1.1, les méthodes de requête HTTP incluent OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT

Habituellement, nous utilisons uniquement GET et POST, mais pour Restful selon Selon la spécification de l'API, la méthode PUT doit être utilisée pour demander des ressources et la méthode DELETE doit être utilisée pour supprimer des ressources.

Par exemple, envoyez un paquet DELETE :

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

Ensuite, vous pouvez obtenir les informations via l'identifiant. Ce paquet n'a qu'un en-tête et aucun corps. discutez-en quelques-uns. Le format de transmission du corps du paquet contenant le corps.


0x02.Content-Type

Content-Type est utilisé pour spécifier le type de contenu, qui fait généralement référence au Content-Type qui existe dans la page Web. L'attribut spécifie le type de contenu de la requête HTTP et de la réponse. Si ContentType n’est pas spécifié, la valeur par défaut est text/html.

Il existe un fichier de configuration mime.types dans nginx, qui indique principalement le format de fichier de Content-Type.

Voici plusieurs types de contenu courants :

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
...

Les premiers sont faciles à comprendre, ce sont tous des types de fichiers HTML, CSS et Javascript, et les quatre derniers sont des méthodes de livraison POST.


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

application/x-www-form-urlencoded est une méthode de livraison de formulaire couramment utilisée. La soumission de formulaire ordinaire ou la livraison js se fait par défaut. De cette façon,

Par exemple, un formulaire simple :

<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>

Ensuite l'entête brut reçu par le serveur sera similaire :

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

Ensuite l'en-tête brut corps reçu par le serveur Ce sera, name=homeway&key=nokey, en php, vous pouvez obtenir des données sous forme de tableau via $_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

Envoyer les données au serveur sous forme json Au début, j'ai essayé d'envoyer le package au format application/json au serveur via curl,

Cependant, les données que j'ai reçues sont les suivantes :

--------------------------e1e1406176ee348a Disposition du contenu : nom-données du formulaire="nid" 2 --------------------------e1e1406176ee348a Disposition du contenu : nom des données du formulaire ; ="uuid" cf9dc994-a4e7-3ad6-bc54-41965b2a0dd7 --------------------------e1e1406176ee348a Disposition du contenu : form-data name="access_token" 956731586df41229dbfec08dd5d54eedb98d73d2 --------- ----e1e1406176ee348a--

Plus tard, j'ai compris qu'il n'y avait pas de soi-disant json dans la communication HTTP, mais une conversion de chaîne Cela devient simplement json, c'est-à-dire que

peut être compris comme application/json, une chaîne ordinaire. text/plain

La raison pour laquelle il y a tant de choses compliquées

Il devrait y avoir un problème de conversion lorsque le tableau PHP est transféré dans-------

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn