php$post获取不到,PHP $_POST获取不到值

Visual Studio Code + PHP 写了两个简单的接口发现Post接口总是拿不到值,找到百度中的很多无效的信息:

1.在php.ini中把允许post的请求设置为On,很傻既然系统默认注释了Off那么肯定默认是允许Post的.网上的很多评论都是说环境有问题,就傻傻去修改了系统中的PHP配置结果是无效的.

2.通过修改请求头的的Content-Type 无效.

找来找去始终都没相信是:以为这个是H5提交的事件,传值给接口的.结果确实

php://input 看来还是需要多看书.

首先了解下《[$_POST,$HTTP_RAW_POST_DATA 和 php://input 的区别]之间的区别:

标签的 enctype 属性:

1:application/x-www-form-urlencoded --> 默认模式,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值

2:multipart/form-data --> 不对字符编码,在使用包含文件上传控件的表单时,必须使用该值。

3:text/plain --> 空格转换为 "+" 加号,但不对特殊字符编码。

PHP 可以用 ($_POST,$HTTP_RAW_POST_DATA 和 php://input)方式来获取Post 数据;

# 一:$_POST

$_POST,是获取表单 POST 过来数据(body部分)的最常用方法,上传的文件信息使用 $_FILES 获取。)

# 二:$HTTP_RAW_POST_DATA

当浏览器从表单发送 POST 请求的时候,默认的 media type 是 "application/x-www-form-urlencoded",意思就是字段名和值都编码了,每个 key-value 对使用 '&' 字符分隔开,key 和 value 使用 '=' 分开,并且 key 和 value 中的空格都会被替换成 + ,其他特殊字符都会被使用 urlencode 方式进行编码。)

例子:

nickname: leyangjun php

num: 18

formula: a + b == 66%!

nickname=leyangjun+php&num=18&formula=a+%2B+b+%3D%3D+13%25%21

PHP会解析这些原始的POST数据,并且格式化成数组,填充到 $_POST 中:

Array

(

[nickname] => leyangjun php

[num] => 18

[formula] => a + b == 13%!

)

$HTTP_RAW_POST_DATA 是 PHP 的一个预定义的变量,用来获取原始的 POST 数据,比如上面的情况下,$HTTP_RAW_POST_DATA 的值就是:nickname=leyangjun+php&num=18&formula=a+%2B+b+%3D%3D+13%25%21;

不支持 enctype="multipart/form-data" 方式传递的数据,这种情况下,我们要用 $_POST 获取字段的内容,$_FILES 来获取上传的文件信息 ;

需要在 php.ini 中设置开启:always_populate_raw_post_data = On,php7后已经是-1(WarningThis feature was DEPRECATED in PHP 5.6.0, and REMOVED as of PHP 7.0.0.),被删除了;

![image](https://upload-images.jianshu.io/upload_images/3231631-178ee7ce3bed782c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

# 三:php://input

替代:$HTTP_RAW_POST_DATA

可以使用 php://input 来获取原始的 POST 数据,并且 php://input 比 $HTTP_RAW_POST_DATA 更少消耗内存,当然 php://input 和 $HTTP_RAW_POST_DATA 一样,它也不支持 enctype="multipart/form-data" 方式传递的数据。

由于 php://input 只是数据流,我们可以使用 file_get_contents() 函数去获取它的内容:

$post_data = file_get_contents('php://input');

print_r($post_data);

获取到的内容和 $HTTP_RAW_POST_DATA 是一样的。

**原始的 POST 数据有什么用**:很多时候接收到不是网页 POST 过来的数据,而是可能通过其他方式 POST 过来的 "text/xml" 格式的数据,这些内容无法解析成 $_POST 数组,这个时候我们就需要原始的 POST 数据进行处理

# 四:总结

1、如果是 application/x-www-form-urlencoded 和 multipart/form-data 格式 用 $_POST;

2、如果不能获取的时候比如 text/xml、application/json、soap,使用 file_get_contents('php://input');

可以愉快的开始写接口了.

{'success': 1, 'msg': '登录成功!', 'code': '200', 'data': {'username': 'kiwi', 'password': '123456'}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值