在表单提交数据时,需要告诉服务端自己的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的更多相关文章

  1. 转载 SharePoint【Site Definition 系列】– 创建Content Type

    转载原地址:  http://www.cnblogs.com/wsdj-ITtech/archive/2012/09/01/2470274.html Sharepoint本身就是一个丰富的大容器,里面 ...

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

  3. php表单提交 图片、音乐、视频、文字,四种类型共同提交到数据库

    这个问题一直困扰了我好几天,终于在今天让我给解决了,难以掩饰的激动. 其实在之前没有接触到这种问题,只是表单提交数据而已,再就是图片,四种类型同时提交还真是没遇到过,做了一个系统,其中有一个功能就是提 ...

  4. 今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式

    今天在研究jquery用ajax提交form表单中得数据时,学习到了一种新的提交方式 jquery中的serialize() 方法 该方法通过序列化表单值,创建 URL 编码文本字符串 序列化的值可在 ...

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

  6. .NET获取文件的MIME类型(Content Type)

    第一种:这种获取MIME类型(Content Type)的方法需要在.NET 4.5之后才能够支持,但是非常简单. 优点:方便快捷 缺点:只能在.NET 4.5之后使用 public FileResu ...

  7. org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported或其他Content type不支持处理

    很久没从头到尾搭框架,今天搭的过程中,springmvc controller方法入参用@RequestBody自动绑定参数时一直提示各种 not supported 排查问题有两个解决路径: 1)使 ...

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

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

随机推荐

  1. 运行 python *.py 文件出错,如:python a.py

    运行 python *.py 文件出错,如:python a.py(下图) 原因:没有安装web.py 解决:下载并安装 网址:http://webpy.org/install#install  (h ...

  2. 第二章 运算方法与运算器(浮点数的加减法,IEEE754标准32/64浮点规格化数)

    这一章,主要介绍了好多种计算方法.下面,写一点自己对于有些计算(手写计算过程)的见解. 1.原码.反码.补码 原码:相信大家都会写,符号位在前二进制数值在后,凑够位数即可. 反码:原码符号位不变,其他 ...

  3. 你不可不知的Java引用类型之——虚引用

    定义 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型中最弱的一个.一个对象是否有虚引用的存在,完全不会对其生命周期构成影响,也无法通过虚引用获 ...

  4. verilog实现红黄蓝三秒灯

    代码如下 test.v文件 led.v文件 module test(); wire led_r,led_g,led_b; ; clk <= ~clk; led c1 ( .clk(clk), . ...

  5. 资深程序员整理出来的Python面试题

    转载链接:https://www.cnblogs.com/fcxwz/p/9225791.html

  6. MySQL 基本语句(2)

    1.创建数据库 :create database 名称 [charset 字符集 collate 校对规则] ;  如: drop database if exists `mydb` ; # 若存在就 ...

  7. EOS之eosio.token合约的部署和发放token

    eosio.token智能合约 在eos目录中自带的合约中,有一个eosio.token智能合约,这个智能合约的功能是为账户发放token,token可以用来转账操作. 操作步骤 在eos私有节点操作 ...

  8. Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)

    execve系统调用 execve系统调用 我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序. x8 ...

  9. IO测试工具之fio详解

    目前主流的第三方IO测试工具有fio.iometer和Orion,这三种工具各有千秋. fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的 ...

  10. mysql 数据备份与数据导入到出

    一.数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数 ...