php原生input提交方式,几种content-type提交以及$_POST 和php://input

在表单提交数据时,需要告诉服务端自己的content-type,好让服务端处理。

默认表单提交是x-www-form-urlencoded,还有一种常见的 multipart/form-data。那这俩的区别是啥呢?

在postman工具中,很容易看出来二者的区别。

x-www-form-urlencoded:

1e127346eadb8e2365d663bdecd05773.png

查看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:

9ecc9fd578f883d8c400c2fc5bbe254d.png

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

ee3ebd4b6af6c6e28196bb087a41a367.png

查看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是数组形式。

07d81769dd0dc2c544d410f227abc456.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个使用原生 AJAX 发送 POST 请求的完整案例: HTML 代码: ``` <!DOCTYPE html> <html> <head> <title>使用原生 AJAX 发送 POST 请求</title> <meta charset="UTF-8"> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script> </head> <body> <h1>使用原生 AJAX 发送 POST 请求</h1> <form> <label for="name">姓名:</label> <input type="text" id="name" name="name"><br><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email"><br><br> <button type="button" id="submit">提交</button> </form> <div id="result"></div> <script src="main.js"></script> </body> </html> ``` JavaScript 代码: ``` document.getElementById("submit").addEventListener("click", function() { var name = document.getElementById("name").value; var email = document.getElementById("email").value; var xhr = new XMLHttpRequest(); xhr.open("POST", "submit.php", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (this.readyState === XMLHttpRequest.DONE && this.status === 200) { document.getElementById("result").innerHTML = this.responseText; } }; xhr.send("name=" + name + "&email=" + email); }); ``` PHP 代码(submit.php): ``` <?php $name = $_POST["name"]; $email = $_POST["email"]; echo "姓名:" . $name . "<br>邮箱:" . $email; ?> ``` 注意:这个案例使用了 jQuery 库,但是只是为了方便引入 Ajax 库。实际上,这个案例并不需要 jQuery。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值