0.说明
-
大叔
:二翔
我们要做一个微信公众号哦。我来教你大概的流程好不好?(开启装逼模式中 ) -
二翔
:好啊,快讲快讲。(无限期待中 ) -
大叔
:你知道application/x-www-form-urlencoded
是什么嘛? -
二翔
:啊咧咧? -
大叔
:你知道php
怎么获得raw
? -
二翔
:啊咧咧? -
大叔
:用下面这种方法来实现。
echo file_get_contents("php://input");
-
二翔
:啊咧咧? -
二翔
:php://input
是什么东西? -
大叔
:嘿嘿,自己去了解吧。
<!--more-->
1.无情浪子 POST
编故事
POST平常看起来人畜无害,但是有句话说的好。最可怕的不是鬼怪,而是人心(Content-Type)。POST在明面上,只有一个老婆叫做application/x-www-form-urlencoded
,其实他一共有好几个伴侣。
-
键值妹
:application/x-www-form-urlencoded
-
文件妹
:multipart/form-data
-
多胞胎
:raw
text/plain
text/html
text/xml
application/json
application/xml
application/javascirpt
2.辨别真心 Content-Type
0.说明
我们想知道POST
心里装着的人是谁怎么办呢,这次请出感情专家 postman
来帮忙。
1.application/x-www-form-urlencoded
报文
POST HTTP/1.1
Host: 127.0.0.1
Cache-Control: no-cache
Postman-Token: 4f2704aa-81e6-be22-4c36-8787ba945a22
Content-Type: application/x-www-form-urlencoded
name=lionis&sex=man
服务端代码
<?php
var_dump($_POST);
输出
array(2) {
["name"]=>
string(6) "lionis"
["sex"]=>
string(3) "man"
}
结论
application/x-www-form-urlencoded
是常用的表单发包方式,普通的表单提交,默认都是通过这种方式。 对于PHP用$_POST
获得键值对。
2.multipart/form-data
报文
POST HTTP/1.1
Host: 127.0.0.1
Cache-Control: no-cache
Postman-Token: f7640c52-6667-b4e8-aee8-02b0e1656969
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="name"
lionis
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="sex"
man
----WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="avater"; filename=""
Content-Type:
----WebKitFormBoundary7MA4YWxkTrZu0gW
服务端代码
<?php
var_dump($_POST);
var_dump($_FILES);
输出
array(2) {
["name"]=>
string(6) "lionis"
["sex"]=>
string(3) "man"
}
array(1) {
["avater"]=>
array(5) {
["name"]=>
string(36) "0CD0A5235EDCDAAB4AFE05B25695E696.png"
["type"]=>
string(9) "image/png"
["tmp_name"]=>
string(45) "/Applications/XAMPP/xamppfiles/temp/phpeFfc9e"
["error"]=>
int(0)
["size"]=>
int(9485)
}
}
结论
multipart/form-data
用在发送文件的POST包。对于PHP用$_FILE
获取文件内容,用$_POST
获得键值对。
3.raw
报文
POST HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 9e0c339b-a6b0-c534-5c62-63ef8dc887c4
{
"user": "xieyuandong",
"sex": "man"
}
服务端代码
<?php
var_dump(file_get_contents('php://input'));
输出
string(47) "{
"user": "xieyuandong",
"sex": "man"
}"
结论
raw
可以上传json
,xml
,文本
等等。对于PHP用php://input
获得内容。
3.$_POST vs php://input vs HTTP_RAW_POST_DATA
1.$_POST
可以获 Content-Type
为 application/x-www-form-urlencoded
或者 multipart/form-data
的请求。
2.HTTP_RAW_POST_DATA
$POST
不能获取的方式,都会存储在HTTP_RAW_POST_DATA
,用$GLOBALS['HTTP_RAW_POST_DATA']
接收。给内存
带来的压力较大,并且需要 php.ini
设置。
3.php://input
允许读取 POST
的原始数据。给内存
带来的压力较小,并且不需要 php.ini
设置。不能用于 enctype="multipart/form-data"
。
4.结论
在php 7
中已经取消了HTTP_RAW_POST_DATA
,我们平时使用$POST
和php://input
就好了。
一起成长
在困惑的城市里总少不了并肩同行的 伙伴
让我们一起成长。
- 如果您想让更多人看到文章可以点个
点赞
。 - 如果您想激励小二可以到 Github 给个
小星星
。 - 如果您想与小二更多交流添加微信
m353839115
。
本文原稿来自 PushMeTop
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。