file_get_contents(“php://input”)[通俗易懂]

file_get_contents(“php://input”)

大家好,又见面了,我是全栈君。

$data = file_get_contents(“php://input”);
    php://input 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 php://input 来代替 $HTTP_RAW_POST_DATA,因为它不依赖于特定的 php.ini 指令。 而且,这样的情况下 $HTTP_RAW_POST_DATA 默认没有填充, 比激活 always_populate_raw_post_data 潜在需要更少的内存。 enctype=”multipart/form-data” 的时候 php://input 是无效的。 

    
 
1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据 时,http request entity body部分都为空。 

2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。
 
学习笔记
 1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST 

 2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA 

 3, 只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。 

 4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。 

 5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini 

 6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。

例子

 1.php用file_get_contents(“php://input”)或者$HTTP_RAW_POST_DATA可以接收xml数据

 比如:

 

 getXML.php;//接收XML地址
  
<?php 
     $xmldata = file_get_contents("php://input"); 
     $data = (array)simplexml_load_string($xmldata); 
?> 

 

  这里的$data就是包含xml数据的数组,具体php解析xml数据更新详细的方法

  sendXML.php

 
<?php 
     $xml = '<xml>xmldata</xml>';//要发送的xml 
     $url = 'http://localhost/test/getXML.php';//接收XML地址 

     $header = 'Content-type: text/xml';//定义content-type为xml 
     $ch = curl_init(); //初始化curl 
     curl_setopt($ch, CURLOPT_URL, $url);//设置链接 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息 
     curl_setopt($ch, CURLOPT_HTTPHEADER, $header);//设置HTTP头 
     curl_setopt($ch, CURLOPT_POST, 1);//设置为POST方式 
     curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);//POST数据 
     $response = curl_exec($ch);//接收返回信息 
     if(curl_errno($ch)){//出错则显示错误信息 
     print curl_error($ch); 
     } 
     curl_close($ch); //关闭curl链接 
     echo $response;//显示返回信息 
?> 

 2.一个手机上传图片到服务器的小程序

  上传文件

   
<?php 
     //@file phpinput_post.php 
     $data=file_get_contents('btn.png'); 
     $http_entity_body = $data; 
     $http_entity_type = 'application/x-www-form-urlencoded'; 
     $http_entity_length = strlen($http_entity_body); 
     $host = '127.0.0.1'; 
     $port = 80; 
     $path = '/p_w_picpath.php'; 
     $fp = fsockopen($host, $port, $error_no, $error_desc, 30); 
     if ($fp){ 
        fputs($fp, "POST {$path} HTTP/1.1\r\n"); 
        fputs($fp, "Host: {$host}\r\n"); 
        fputs($fp, "Content-Type: {$http_entity_type}\r\n"); 
        fputs($fp, "Content-Length: {$http_entity_length}\r\n"); 
        fputs($fp, "Connection: close\r\n\r\n"); 
        fputs($fp, $http_entity_body . "\r\n\r\n"); 

        while (!feof($fp)) { 
         $d .= fgets($fp, 4096); 
        } 
        fclose($fp); 
        echo $d; 
     } 
?> 

  接收文件

  
<?php 
        /** 
         *Recieve p_w_picpath data 
        **/    
        error_reporting(E_ALL); 

     function get_contents() {    
        $xmlstr= file_get_contents("php://input"); 
        $filename=time().'.png'; 
        if(file_put_contents($filename,$xmlstr)){ 
         echo 'success'; 
        }else{ 
         echo 'failed'; 
        } 
        } 
        get_contents(); 
?>

  

 3.获取HTTP请求原文

  
/** 
     * 获取HTTP请求原文 
     * @return string 
     */ 
    function get_http_raw() { 
     $raw = ''; 

     // (1) 请求行 
     $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; 

     // (2) 请求Headers 
     foreach($_SERVER as $key => $value) { 
        if(substr($key, 0, 5) === 'HTTP_') { 
         $key = substr($key, 5); 
         $key = str_replace('_', '-', $key); 

         $raw .= $key.': '.$value."\r\n"; 
        } 
     } 

     // (3) 空行 
     $raw .= "\r\n"; 

     // (4) 请求Body 
     $raw .= file_get_contents('php://input'); 

     return $raw; 
}

  转载:https://blog.51cto.com/taoshi/1165499

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112137.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JS图片水印(水印图片)

    attendanceClick(userID,headImg,userName,company,scoreNmu){letbase64Image=’assets/imagesaring.png’;letbase64Image1=’assets/imagesaring1.png’;letbase64Image2=’assets/imagesar…

    2022年4月15日
  • 网页视频下载(TS流下载合成)

    网页视频下载(TS流下载合成)前言最近《流浪地球》比较火,想找资源下载看看,无奈只找到了网址http://m.tlyy.tv/,但是我的chrome插件也嗅探不到网页上的视频。。于是乎,右击页面,inspect走起…步骤首先发现m3u8文件映入眼帘/偷笑,m3u8文件是什么文件呢,copyaddressandwget下来看看:文件playlist.m3u8内容如下,可见网页里的视频是根据这个play…

    2022年7月18日
  • 什么是分区容错性?[通俗易懂]

    什么是分区容错性?[通俗易懂]这个回答我觉得一个知乎上的老哥说的特别好,我把他的话引用过来。原回答地址:https://www.zhihu.com/question/54105974一个分布式系统里面,节点组成的网络本来应该是连通的。然而可能因为一些故障,使得有些节点之间不连通了,整个网络就分成了几块区域。数据就散布在了这些不连通的区域中。这就叫分区。当你一个数据项只在一个节点中保存,那么分区出现后,和这个节点不连通的部分就访问不到这个数据了。这时分区就是无法容忍的。提高分区容忍性的办法就是一个数据项复制到多个节点.

    2022年7月25日
  • 生成h5文件_h5实现文件下载

    生成h5文件_h5实现文件下载生成训练h5文件importh5pyimportosimportcv2importmathimportnumpyasnpimportrandomimportroot_path=”/home/tyd/caffe_case/HDF5/image”withopen(“/home/tyd/caffe_case/HDF5/hdf5.txt”,”r”)…

    2022年9月9日
  • visibilitychange – 指定标签页可见时,刷新页面数据

    visibilitychange – 指定标签页可见时,刷新页面数据三个知识点:一通过监听浏览器页面可见性改变(visibilitychange)事件,来判断标签页是否可见二配置路由的meta,来判断是否是指定的标签页三调用其它模块的actions,刷新数据router.jsroutes:[{path:”/”,redirect:”index”},{path:”/ind…

    2022年6月15日
  • Gstreamer中加入�x265编解码器

    Gstreamer中加入�x265编解码器

    2021年12月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号