php如何模拟处理http put请求?实例教程

 

可用

    function callInterfaceCommon($URL, $type, $params, $headers){ 
        $ch = curl_init(); 
        $timeout = 5;
        curl_setopt ($ch, CURLOPT_URL, $URL); //接口地址

        if($headers!=""){ 
            curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); 
        }else { 
            curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Content-type:application/json;charset=utf-8")); 
        } 
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); 
        switch ($type){ 
            case "GET" : curl_setopt($ch, CURLOPT_HTTPGET, true);break; 
            case "POST": curl_setopt($ch, CURLOPT_POST,true);  
                         curl_setopt($ch, CURLOPT_POSTFIELDS, $params);break; 
            case "PUT" : curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PUT");  
                         curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; 
            case "DELETE":curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE");  
                          curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; 
        } 
        $file_contents = curl_exec($ch);//获得返回值 
        curl_close($ch);
        return $file_contents;
    }

    // $params="{user:\"admin\",pwd:\"admin\"}"; 
    $params = '{"status":"1"}'; 
    $headers = array('Content-type: application/json'); 
    //$url= $GLOBALS["serviceUrl"]."/user"; 
    $strResult = callInterfaceCommon($putApi, "PUT", $params); 

    var_dump($strResult);

 

-----------------------------------------

 

to create variable such as $_GET, $_POST use
that solution

<?php
    $_SERVER
['REQUEST_METHOD']==="PUT" ? parse_str(file_get_contents('php://input', false , null, -1 , $_SERVER['CONTENT_LENGTH'] ), $_PUT): $_PUT=array();
?>

 

 

PHP中模拟处理HTTP PUT请求的例子

 

有关HTTP PUT详细介绍,请参考文章:http://www./article/23432.html
PHP里有$_GET,$_POST,但是没有$_PUT,所以如果需要使用,则需要自己模拟一下:
 

 

代码示例:

 

 $_PUT = array();
if ('PUT' == $_SERVER['REQUEST_METHOD']) {
     parse_str(file_get_contents('php://input'), $_PUT);
 }
 

 

通过php://input得到的数据是raw data,所以需要用parse_str解析一下。

 

说明,当表单是enctype="multipart/form-data"类型的时候(就是上传文件那种类型),这种方法是无效的(此时 php://input为空),一旦PHP发现请求的Content-Type是multipart/form-data,就会无条件的代你处理表单数 据,然后保存到$_FILES里,此时无法得到raw data,只能用一些偏门方法。

以apache为例,修改httpd.conf(为了使用RequestHeader语法,请先激活header模块):

 

 

<?php
 
function curlrequest( $url , $data , $method = 'post' ){
     $ch = curl_init(); //初始化CURL句柄
     curl_setopt( $ch , CURLOPT_URL, $url ); //设置请求的URL
     curl_setopt( $ch , CURLOPT_RETURNTRANSFER,1); //设为TRUE把curl_exec()结果转化为字串,而不是直接输出
     curl_setopt( $ch , CURLOPT_CUSTOMREQUEST, $method ); //设置请求方式
     
     curl_setopt( $ch ,CURLOPT_HTTPHEADER, array ( "X-HTTP-Method-Override: $method" )); //设置HTTP头信息
     curl_setopt( $ch , CURLOPT_POSTFIELDS, $data ); //设置提交的字符串
     $document = curl_exec( $ch ); //执行预定义的CURL
     if (!curl_errno( $ch )){
       $info = curl_getinfo( $ch );
       echo 'Took ' . $info [ 'total_time' ] . ' seconds to send a request to ' . $info [ 'url' ];
     } else {
       echo 'Curl error: ' . curl_error( $ch );
     }
     curl_close( $ch );
     
     return $document ;
}
 
$url = 'http://localhost/test/curl.php' ;
$data = "request from put method" ;
$return = curlrequest( $url , $data , 'put' );
 
var_dump( $return ); exit ;
?>
    function curlPut()
    {
         //PUT

        $curl_handle = curl_init ();
        // Set default options.
        curl_setopt ( $curl_handle, CURLOPT_URL, 'http://my.focus.cn/test/socket.php');
        curl_setopt ( $curl_handle, CURLOPT_FILETIME, true );
        curl_setopt ( $curl_handle, CURLOPT_FRESH_CONNECT, false );


        curl_setopt ( $curl_handle, CURLOPT_HEADER, true );
        curl_setopt ( $curl_handle, CURLOPT_RETURNTRANSFER, true );
        curl_setopt ( $curl_handle, CURLOPT_TIMEOUT, 5184000 );
        curl_setopt ( $curl_handle, CURLOPT_CONNECTTIMEOUT, 120 );
        curl_setopt ( $curl_handle, CURLOPT_NOSIGNAL, true );
        curl_setopt ( $curl_handle, CURLOPT_HEADER, true );
        curl_setopt ( $curl_handle, CURLOPT_CUSTOMREQUEST, 'PUT' );
        $aHeader[] = "Content-Type:text/xml;charset=UTF-8";
        $aHeader[] = "x-bs-ad:private";
        curl_setopt($curl_handle, CURLOPT_HTTPHEADER, $aHeader);
        $file = 'client.php';
        $file_size = filesize($file);
        $h = fopen($file,'r');
        curl_setopt ( $curl_handle, CURLOPT_INFILESIZE, $file_size);
        curl_setopt ( $curl_handle, CURLOPT_INFILE, $h);
        curl_setopt ( $curl_handle, CURLOPT_UPLOAD, true );
        $ret = curl_exec ( $curl_handle );
        print_r($ret);
    }
    $data = '{"status":"0"}';
    $return = curlrequest($putApi, $data, 'put');
    var_dump($return);
    exit;
// header('Content-type:application/json;charset=utf-8');
// header('Access-Control-Allow-Origin: *');
// header('Access-Control-Allow-Credentials: true');
// header('Access-Control-Allow-Methods: GET,POST');   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值