在表单提交数据时,需要告诉服务端自己的content-type,好让服务端处理。
默认表单提交是x-www-form-urlencoded,还有一种常见的 multipart/form-data。那这俩的区别是啥呢?
在postman工具中,很容易看出来二者的区别。
x-www-form-urlencoded:
查看http请求:
POST /hi.php HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache
Postman-Token: a1054dd4-5f58-038c--326721c85a7a
id=%2B1&val=
在 x-www-form-urlencoded中,body体中是key=value&key=xx形式,并且是urlencode后的。
multipart/form-data:
查看http请求:
POST /hi.php HTTP/1.1
Host: localhost
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: dddb1f15-348b-5e3f-244c-aa0d8680bd3d
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="id"
+
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="val"
------WebKitFormBoundary7MA4YWxkTrZu0gW--
form-data中含有boundary=----***
常见的content-type还有一种json形式:
Content-Type: application/json
查看http请求:
POST /hi.php HTTP/1.1
Host: localhost
Content-Type: application/json
Cache-Control: no-cache
Postman-Token: 38f8844e-bd9f-a892-5107-a3f4e6b81a41
{"a":"xx"}
再看下$_POST和php://input的区别联系
利用一段测试代码:
$arr = $_POST;
$raw_post_data = file_get_contents('php://input', 'r');
file_put_contents('hsd.log', "\$_POST\r\n".print_r($arr,true)."\r\n", FILE_APPEND);
file_put_contents('hsd.log', "php://input\r\n".print_r($raw_post_data,true)."\r\n", FILE_APPEND);
file_put_contents('hsd.log', "content_type: ".print_r($_SERVER['HTTP_CONTENT_TYPE'],true)."\r\n", FILE_APPEND);
file_put_contents('hsd.log', print_r("====================",true)."\r\n", FILE_APPEND);
在几种content-type表现如下:(php version 5.5.3)
1. 当是x-www-form-urlencoded时,
$_POST
Array
(
[id] => 1+1
[val] => 44753
)
php://input
id=1%2B1&val=44753
content_type: application/x-www-form-urlencoded
php://input中的形式和body体中是一样的,同样是urlencode过的。
2. 当是 multipart/form-data时,
$_POST
Array
(
[id] => 1+111
[val] => 44753
)
php://input
content_type: multipart/form-data; boundary=----WebKitFormBoundaryUUacTtaG65hX7g6y
发现$_POST依然可以获取到参数。此时php://input 获取不到值。
(测试在hhvm HipHop VM 3.0.1;baidu version:1.0.6.4 php://input可以获取到multipart/form-data 提交参数)如下:
$_POST
Array
(
[id] => 1+111
[val] => 44753
)
php://input
------WebKitFormBoundaryxHArWQUlukzFfZAb
Content-Disposition: form-data; name="id"
1+111
------WebKitFormBoundaryxHArWQUlukzFfZAb
Content-Disposition: form-data; name="val"
44753
------WebKitFormBoundaryxHArWQUlukzFfZAb--
content_type: multipart/form-data; boundary=----WebKitFormBoundaryxHArWQUlukzFfZAb
3. 当是application/json时,
$_POST
Array
(
)
php://input
{"a":"xx"}
content_type: application/json
此时,$_POST获取不到提交参数。php://input 可以获取到。这种json提交数据,php接收参数需要使用 file_get_contents('php://input', 'r')。
总结:
$_POST只能获取到form提交的数据,而php://input获取不到 multipart/form-data提交的数据。
这里顺便提下,如何提交给php获取$_POST的key=>value是数组形式。
$arrParams = array(
'person[0][first_name]' => 1,
'person[0][last_name]' => 1,
'person[1][first_name]' => 111,
'person[1][last_name]' => 222,
);
这样$_POST['person'] 就是个二维数组了。
$_POST
Array
(
[person] => Array
(
[0] => Array
(
[first_name] => a
[last_name] => b
)
[1] => Array
(
[last_name] => d
)
)
)
php://input
person%5B0%5D%5Bfirst_name%5D=a&person%5B0%5D%5Blast_name%5D=b&person%5B1%5D%5Blast_name%5D=c&person%5B1%5D%5Blast_name%5D=d
content_type: application/x-www-form-urlencoded
随机推荐
asp.net signalR 专题—— 第三篇 如何从外部线程访问 PersistentConnection
在前面的两篇文章中,我们讲到的都是如何将消息从server推向client,又或者是client再推向server,貌似这样的逻辑没什么异常,但是放在真实 的环境中,你会很快发现有一个新需求,如何根据 ...
在sql设计中没法修改表结构
在做练习的时候经常表没设计好,后来有要去数据库修改表结构但是没词用界面修改的时候都会提示要保存 转自http://www.57xue.com/ItemView/Sql/2016061600160.ht ...
在自己的网站上实现QQ授权登录
最近在实现QQ授权登录,现将我的实现过程以及我的理解整理如下.以下所述如有不对之处,请指正. 官方提供的SDK有:JS,PHP,Java.我的网站使用Scala+Play搭建的,所以只能用JS SDk ...
POJ1961 KMP算法
POJ1961 问题重述: 输入一个长度为l的字符串S,求所有S的由字串重复排列而成的前缀,并输出前缀的长度以及该前缀的最大重复度. AC代码: //Memory: 5700K Time: 641MS ...
SQL Server插入中文数据后出现乱码
今天在做项目的过程中遇到如标题的问题,情况如下图: 数据库使用的是SQL Server2012版本,创建表的脚本如下: CREATE TABLE [dbo].[Type]( [TypeId] INT ...
再叙Java反射
Java中的反射 本文为反射的基础知识部分. 能够分析类能力的程序被称为反射(reflective). 反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,容许程序在运行时加载.探知. ...
window7下配置python2.7+tornado3.3开发环境
发现之前写太繁琐..这里分享下同学的方法 1,安装 Python 2.7.x 版本地址:https://www.python.org/downloads/release/python-278/2,安装 ...
【转】JY 博客
http://www.lovewebgames.com/demo.html http://www.lovewebgames.com/
[Beta阶段]展示博客
一.团队成员简介与个人博客地址 团队博客地址:http://www.cnblogs.com/wowotoubuaa/ 江昊,项目经理http://www.cnblogs.com/haoj/ 王开,后端 ...
JS、JAVA刷题和C刷题的一个很重要的区别
就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别 当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方 但是JS ...