几种content-type提交以及$_POST 和php://input
在表单提交数据时,需要告诉服务端自己的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的区别联系
利用一段测试代码:
<?php
$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
几种content-type提交以及$_POST 和php://input的更多相关文章
- 转载 SharePoint【Site Definition 系列】– 创建Content Type
转载原地址: http://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html Sharepoint本身就是一个丰富的大容器,里面 ...
- the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header
the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...
- php表单提交 图片、音乐、视频、文字,四种类型共同提交到数据库
这个问题一直困扰了我好几天,终于在今天让我给解决了,难以掩饰的激动. 其实在之前没有接触到这种问题,只是表单提交数据而已,再就是图片,四种类型同时提交还真是没遇到过,做了一个系统,其中有一个功能就是提 ...
- 今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式
今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式 jquery中的serialize() 方法 该方法通过序列化表单值,创建 URL 编码文本字符串 序列化的值可在 ...
- Springs Element 'beans' cannot have character [children], because the type's content type is element-only
Springs Element 'beans' cannot have character [children], because the type's content type is element ...
- .NET获取文件的MIME类型(Content Type)
第一种:这种获取MIME类型(Content Type)的方法需要在.NET 4.5之后才能够支持,但是非常简单. 优点:方便快捷 缺点:只能在.NET 4.5之后使用 public FileResu ...
- org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported或其他Content type不支持处理
很久没从头到尾搭框架,今天搭的过程中,springmvc controller方法入参用@RequestBody自动绑定参数时一直提示各种 not supported 排查问题有两个解决路径: 1)使 ...
- jmeter报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported"的解决方法
1.报"msg":"Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supporte ...
- Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决
Java之POI读取Excel的Package should contain a content type part [M1.13]] with root cause异常问题解决 引言: 在Java中 ...
随机推荐
- eclipse安装其他颜色主题包
eclipse安装其他颜色主题包: 用Help-Install new software安装的时候,work with的URL是 http://eclipse-color-theme.github.c ...
- ImportError: No module named simplejson.scanner
一.出现ImportError: No module named simplejson.scanner,是没有安装simplejson,安装一下就好了. 安装指令:python setup.py in ...
- wangEditor更改默认高度
在使用WangEditor时觉得高度太低,默认是300px;想调下高度,借鉴https://blog.csdn.net/qq_31384551/article/details/83240188, 网址 ...
- unity修改脚本的图标
我们看别人代码时有时看到人家的脚本显示的不是unity的默认图标,而是自己的logo.如: 这样看上去感觉很专业有没有. 修改方法: 1 在Project窗口中点击选中脚本,在Inspector界面点 ...
- Windows Server 2016-Nano Server介绍
WindowsServer 2016 提供了新的安装选项:Nano Server.Nano Server 是针对私有云和数据中心进行优化的远程管理的服务器操作系统. 类似于 Windows Serve ...
- 使用administrator身份启动Vs2017
日常开发中有些项目工程需要按照Administrator 身份进行启动,我们的操作是在vs2017 上右键,administrator 身份启动. 如下图: 但是这样每次都要右键,移动鼠标进行点击. ...
- 2016某知名互联网公司PHP面试题及答案(续)
1 写出mysql中,插入数据,读出数据,更新数据的语句 INSERT INTO 表名 VALUES ("",""): SELECT * FROM 表名:. U ...
- mysql 中的内置函数
一.字符串函数 select concat(name,"age is",age) from users; insert(str,x,y,insert)//将字符串x位置开始y个位 ...
- jenkins 构建到最后报权限的问题
参考链接 https://blog.csdn.net/sinat_25306771/article/details/54633921 近整理虚拟机的密码 把Jenkins构建相关的远程执行脚本的服 ...
- Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复
由于安装双系统后,Linux 用的比较少.因此,从Win 10 磁盘管理中删除了linux 占用的磁盘空间,重启后无法进入win 10 ,出现如下情况: 有人提出,此时需要重装系统,并不用如此麻烦,通 ...