关闭

$_POST、input数据流和$HTTP_RAW_POST_DATA的区别

标签: _POSTHTTP_RAW_POST_DATAphp input
3658人阅读 评论(0) 收藏 举报
分类:
HTTP 协议是建立在 TCP/IP 协议之上的应用层规范,它把 HTTP 请求分为三个部分:请求行、请求头、消息主体。协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据使用什么编码方式。
服务端通常是根据请求头(headers)中的 Content-Type 来获知请求中的消息主体是用何种方式编码的,再对消息主体进行解析。

当客户端通过 POST 请求访问服务器时,可通过下面三种方式来获取 POST 提交的数据:
1. $_POST
仅当请求头中的  Content-Type 为 application/x-www-data-urlencoded 或 multipart/form-data时,PHP 才会将 POST 数据填充到全局变量 $_POST。
如:表单数据的POST方式提交或curl模拟POST请求时传入数组格式的POST数据(不要使用二维数组)。

2. $HTTP_RAW_POST_DATA
当请求头中的 Content-Type 不是 PHP 能够识别的(如:xml、json),且 php.ini 中已经配置 always_populate_raw_post_data = On,才可以使用 $HTTP_RAW_POST_DATA。但对于enctype="multipart/form-data",它是无效的。
$HTTP_RAW_POST_DATA 或 $GLOBALS['HTTP_RAW_POST_DATA'] 中包含的是原生的 POST 数据。
自 PHP 5.6.0 版本,就不赞成使用它;在 PHP 7.0.0 中已经将其移除。

3. php: //input
当请求头中的 Content-Type 不是 PHP 能够识别的(如:xml、json),就可以使用 php: //input。
如:curl模拟POST请求时传入的json格式的字符串(可以是二维json)或任意字符串。

php: //input 是一个只读的数据流,通过它可以获取请求主体中的原始数据。POST请求时,一般使用 php: //input 来代替 $HTTP_RAW_POST_DATA,因为 php: //input 不用激活always_populate_raw_post_data,这样就减少了潜在的内存消耗。
但对于enctype="multipart/form-data",php: //input 是无效的。
通过 file_get_contents('php://input') 获取原生的POST数据。

2
0
查看评论

$_POST 、$HTTP_RAW_POST_DATA、php://input三者之间的区别

HTTP_RAW_POST_DATA 官方文档解释:原生POST数据。需要通过php.ini开启,开启后可通过全局变量 $GLOBALS['HTTP_RAW_POST_DATA'] 获取到post数据。 需要设置 php.ini 中的 always_populate_raw_...
  • kexiaoling
  • kexiaoling
  • 2016-07-08 11:50
  • 950

$http_raw_post_data 函数使用

通过 HTTP POST 发送的变量不会显示在 URL 中。   当我们用$_POST接受不到页面传过来信息时,我们可以用php://input去接受值,那么他俩有什么区别   首先当$_POST 与 php://input可以取到值时$HTTP_RAW_POST_DATA 为空;   $ht...
  • zhaanghao
  • zhaanghao
  • 2015-07-22 17:18
  • 1097

$GLOBALS['HTTP_RAW_POST_DATA'] 和$_POST的区别

$_POST:通过 HTTP POST 方法传递的变量组成的数组。是自动全局变量。 $GLOBALS['HTTP_RAW_POST_DATA'] :总是产生 $HTTP_RAW_POST_DATA 变量包含有原始的 POST 数据。此变量仅在碰到未识别 MIME...
  • china_skag
  • china_skag
  • 2012-02-22 17:36
  • 84418

PHP用HTTP_RAW_POST_DATA来接收post过来的数据

PHP用HTTP_RAW_POST_DATA来接收post过来的数据 发表回复 用$GLOBALS[‘HTTP_RAW_POST_DATA’]这个变量就可以接收post raw data了 php配置中,必须启用 always_populate_raw_post_data ...
  • u010069940
  • u010069940
  • 2015-05-12 09:31
  • 3042

php 对http内容的解析 $_POST php://input $HTTP_RAW_POST_DATA

PHP输入流php://input 在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探 讨php输入流php://input 对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概...
  • huangxy10
  • huangxy10
  • 2015-03-26 15:25
  • 4280

PHP7.0,PHP7.1.x新特性

PHP7.1.x新特性风.fox1.可为空(Nullable)类型类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是 null 。可以通过在类型前面加上一个问号来使之成为可为空的。function test(?string $name) { var_du...
  • wljk506
  • wljk506
  • 2016-10-01 15:28
  • 9483

PHP7 微信支付回调失败 解决

升级完PHP7 发现微信支付回调失败。原来是 $GLOBALS['HTTP_RAW_POST_DATA'];没有定义的问题。php7 移除了这个全局变量。 问题代码如下: 微信API :WxPay.Api.php public static function notify(...
  • color_wind
  • color_wind
  • 2016-08-01 17:55
  • 4140

微信接口$GLOBALS['HTTP_RAW_POST_DATA']接收不到值

$xml = $GLOBALS['HTTP_RAW_POST_DATA']; 打印$xml出来,结果是null 使用的是php7,原因是php7已移除这个全局变量,改成 $xml = file_get_contents("php://input"); ...
  • buyueliuying
  • buyueliuying
  • 2017-08-22 10:05
  • 1097

解决$GLOBALS["HTTP_RAW_POST_DATA"]获取不到数据的问题

昨天在微信中公众号开发中使用$GLOBALS["HTTP_RAW_POST_DATA"]来获取微信公众平台推送过来的post数据,结果惊奇的发现微信号总是提示“该微信公众号暂时无法提供服务”,仔细去检查代码,也没错,可就是无法提供服务。今天又检查了一把,
  • hpugym
  • hpugym
  • 2017-02-10 13:59
  • 7194

Undefined index: HTTP_RAW_POST_DATA的解决办法

把 $postStr = $GLOBALS["HTTP_RAW_POST_DATA"]; 替换为 $postStr = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $...
  • gdali
  • gdali
  • 2016-12-28 17:15
  • 2350
    个人资料
    • 访问:302844次
    • 积分:5155
    • 等级:
    • 排名:第6382名
    • 原创:233篇
    • 转载:0篇
    • 译文:0篇
    • 评论:39条
    博客专栏
    最新评论