通过 curl 传递数据

方法一(若为post方式,只适用于一维数组

    /**
     * curl发送htpp请求
     * 可以发送https,http,get方式,post方式,post数据发送
     */
    public function dataRequest($url,$https=false,$method='get',$data=null)
    {
        //初始化curl
        $ch = curl_init($url);
        //字符串不直接输出,进行一个变量的存储
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        //https请求
        if ($https === true) {
            //确保https请求能够请求成功
            curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
            curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
        }
        //post请求
        if ($method == 'post') {
            curl_setopt($ch,CURLOPT_POST,true);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
        }
        //发送请求
        $str = curl_exec($ch);
        $aStatus = curl_getinfo($ch);
        //关闭连接
        curl_close($ch);
        if(intval($aStatus["http_code"])==200){
            return json_decode($str);
        }else{
            return false;
        }
    }

方法二(若为post方式,适用于二维数组

/**
 * @Purpose      :  curl发送htpp请求,可以发送https,http,get方式,post方式,post数据发送
 * @Author       :  Chrdai
 * @Method Name  :  SendDataByCurl()
 * @parameter    :  string  $url     传送的 url
 *                  boolean $https   是否使用 https
 *                  string  $method  传递方法
 *                  array   $data    数据
 * @return       :  成功返回对方返回的结果,是非返回 false
 */
function SendDataByCurl($url,$https=false,$method='get',$data=null)
{
    // 初始化curl
    $ch = curl_init($url);
    //curl_exec()获取的信息以字符串返回,而不是直接输出。
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // https请求
    if ($https === true) {
        // 确保https请求能够请求成功
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
    }
    // post请求
    if ($method == 'post') {
     // TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。 curl_setopt(
$ch,CURLOPT_POST,true); // 所需传的数组用http_bulid_query()函数处理一下,就可以传递二维数组了 curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); } // 发送请求 $str = curl_exec($ch); $aStatus = curl_getinfo($ch); // 关闭连接 curl_close($ch); if(intval($aStatus["http_code"])==200){ return json_decode($str); }else{ return false; } }

方法三(若为post方式,适用于传递 json

/**
 * @Purpose      :  curl发送htpp请求,可以发送https,http,get方式,post方式,post数据发送
 * @Author       :  Chrdai
 * @Method Name  :  SendDataByCurl()
 * @parameter    :  string  $url     传送的 url
 *                  boolean $https   是否使用 https
 *                  string  $method  传递方法
 *                  array   $jsonStr 需要传递的 json 字符串
 * @return       :  成功返回对方返回的结果,是非返回 false
 */
function SendDataByCurl($url,$https=false,$method='get',$jsonStr=null)
{
    // 初始化curl
    $ch = curl_init($url);
    // 字符串不直接输出,进行一个变量的存储
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    // https请求
    if ($https === true) {
        // 确保https请求能够请求成功
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
    }
    // post请求
    if ($method == 'post') {
        curl_setopt($ch,CURLOPT_POST,true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonStr);
        // 只需要用个 http 头就能传递 json 啦!
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                'Content-Type: application/json; charset=utf-8',
                'Content-Length: ' . strlen($jsonStr)
            )
        );
    }
    // 发送请求
    $str = curl_exec($ch);
    $aStatus = curl_getinfo($ch);
    // 关闭连接
    curl_close($ch);
    if(intval($aStatus["http_code"])==200){
        return json_decode($str);
    }else{
        return false;
    }
}

方法四:工作中实际使用过,如果上面的都不能成功推送,则可以使用下面这个:

/**
 * curl post方法
 * @param string $url url链接
 * @param string $postfields 要传送的参数
 * @param string $path 写日志的路径
 * @return 返回的结果
 */
function SendDataByCurl($url,$data){
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
    curl_setopt($curl, CURLOPT_POST, true);
    $header[] = 'Content-type:application/x-www-form-urlencoded';
    curl_setopt($curl, CURLOPT_HTTPHEADER,$header);    
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_HEADER, true);
    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}

 方法五、需要设置 header 的时候用这个:

/**
 * POST方式请求
 * @param $url url
 * @param array $params params
 * @param int $timeout timeout
 * @return mixed return responce
 */
function curl_post($url,$params = array(),$header = array(),$timeout=30){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    if(!empty($header)){
        curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
    }
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_POST,1);
    curl_setopt($ch,CURLOPT_POSTFIELDS,is_array($params) ? http_build_query($params) : $params);
    curl_setopt($ch,CURLOPT_HEADER,0);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
    $str = curl_exec($ch);
    curl_close($ch);
    return $str;
}

 

 

方法一和方法二可以在 全局表里 $_REQUEST 或者 $_POST 中获取到

方法三可以使用    $params = file_get_contents("php://input");  来获取。

 CURL 在php官网的网址:http://www.php.net/manual/en/function.curl-setopt.php

 

php给java推送 json 格式的数据的时候,假如对方接收的参数叫 rec ,数据是一个叫 data 的的数组,需要这样转换一下,对方才能成功接收到:

$params = json_encode($data);
$postData = "rec=[".$params.']';

 

 

本文为 小作者工作中的总结,如有转载请注明出处:http://www.cnblogs.com/chrdai/p/6090188.html

 

 

posted @ 2016-11-22 17:30  Chrdai  阅读(9903)  评论(0编辑  收藏  举报