1. 程式人生 > >PHP 如果獲取介面的值和response headers內容

PHP 如果獲取介面的值和response headers內容

  1. 通過file_get_contents獲取介面資訊
    /**
     * 獲取介面內容及相應headers詳情
     * @param string $url 需要請求的url
     * @return array 
     */
    public function getApiContents($url)
    {
        $content = file_get_contents($url);
        // 如果想設定頭資訊或非GET請求等
        $opts = array(
            'http' => array(
                'method'
=> 'POST', // 請求方式 'header' => "Content-Type: text/xml\r\n"."Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n", // 請求頭內容 'content' => $body, // 傳遞的內容 'timeout' => 60 ) ); // 建立並返回一個資源流上下文,該資源流中包含了 options 中提前設定的所有引數的值。
$context = stream_context_create($opts); $content = file_get_contents($url, false, $context, -1, 40000); // 後倆引數是設定擷取字串部分 $responseInfo = $http_response_header; // $responseInfo 輸出結果 //Array //( // [0] => HTTP/1.1 200 OK // [1] => Server: ASP.NET Development Server/11.0.0.0
// [2] => Date: Fri, 11 Aug 2017 09:07:16 GMT // [3] => X-AspNet-Version: 4.0.30319 // [4] => token: WaseLE/13V+xGjiHLorGQqGy3KfOJ // [5] => Cache-Control: no-cache // [6] => Pragma: no-cache // [7] => Expires: -1 // [8] => Content-Length: 0 // [9] => Connection: Close //) // 轉換成鍵值對格式,方便使用 $responseArray = []; foreach ($responseInfo as $response) { $list = explode(":", $response); $responseArray[$list[0]] = $list[1]; } $result = array($content, $responseArray); return $result; }

2.通過Curl方式

    /**
     * 獲取介面內容及相應headers詳情
     * @param string $url 請求的API地址
     * @param array  $post POST所需提交的資料
     * @param string $token 驗證的TOKEN,放header裡
     * @param bool   $returnHeader 是否需要檢視response header內容
     * @return array
     */
    public function getApiContents($url, $post = array(), $token = '', $returnHeader = false)
    {
        // 初始化 cURL 會話
        $curl = curl_init();

        // curl_setopt — 設定 cURL 傳輸選項
        curl_setopt($curl, CURLOPT_URL, $url); // 需要獲取的 URL 地址,也可以在curl_init() 初始化會話的時候。

        //curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');// 在HTTP請求中包含一個"User-Agent: "頭的字串。我覺得沒啥用就註釋了。付個連結供大家瞭解下User-Agent [使用者代理-百度百科](https://baike.baidu.com/item/%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86/1471005?fr=aladdin&fromid=10574244&fromtitle=user-agent)

        //  CURLOPT_FOLLOWLOCATION TRUE 時將會根據伺服器返回 HTTP 頭中的 "Location: " 重定向。(注意:這是遞迴的,"Location: " 傳送幾次就重定向幾次,除非設定了 CURLOPT_MAXREDIRS,限制最大重定向次數。)。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); 

        //  TRUE 時將根據 Location: 重定向時,自動設定 header 中的Referer:資訊。
        curl_setopt($curl, CURLOPT_AUTOREFERER, 1);

        //在HTTP請求頭中"Referer: "的內容。
        //curl_setopt($curl, CURLOPT_REFERER, "http://XXX");

        // 如果有資料需要存 改 一般使用POST,所以通過這種方式判斷是否是POST傳輸
        if(count($post) > 0) {
            //  CURLOPT_POST TRUE 時會發送 POST 請求,型別為:application/x-www-form-urlencoded,是 HTML 表單提交時最常見的一種。
            curl_setopt($curl, CURLOPT_POST, 1); 

            // 如果value是一個數組,Content-Type頭將會被設定成multipart/form-data。由於這個影響了接收,我把陣列轉了下,http_build_query:生成 URL-encode 之後的請求字串
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));
        }

        // 我的API請求規則是,已登入會在response header裡返回個token,在其他請求的時候需要帶上這個token
        if(!empty($token)) {
            $header = ['token: '.$token]; //設定一個你的瀏覽器的header
            curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        }

        /* 如果不設定這個則無法獲取response header內容 */
        curl_setopt($curl, CURLOPT_HEADER, $returnHeader);
        curl_setopt($curl, CURLOPT_TIMEOUT, 10);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        // 執行 cURL 會話
        $data = curl_exec($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        if (curl_errno($curl)) {
            return curl_error($curl);
        }
        // 關閉 cURL 會話
        curl_close($curl);


        $info['code'] = $httpCode;
        if($returnHeader){
            list($header, $body) = explode("\r\n\r\n", $data, 2);
            /* 本來只打算要取個token的,後來覺得還是把所有的都接收下好一點,也許後來會有新的需要呢 */
            //preg_match("/token\:(.*?)\n/", $header, $matches);
            //$info['token']  = trim($matches[1]);

            $headers = explode("\r\n", $header);
            $headList = array();
            foreach ($headers as $head) {
                $value = explode(':', $head);
                $headList[$value[0]] = $value[1];
            }

            $info['header'] = $headList;
            $info['content'] = $body;
        }else{
            $info['content'] = $data;
        }

        return $info;
    }