curl 或 file_get_contents 獲取須要受權頁面的方法

今天因工做須要,須要用 curl / file_get_contents 獲取須要受權(Authorization)的頁面內容,解決後寫了這篇文章分享給你們。php


php curl 擴展,可以在服務器端發起POST/GET請求,訪問頁面,並能獲取頁面的返回數據。
apache

例如要獲取的頁面:http://localhost/server.php
json

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片服務器

  1. <?php  app

  2. $content = isset($_POST['content'])? $_POST['content'] : '';  curl

  3. header('content-type:application/json');  ui

  4. echo json_encode(array('content'=>$content));  加密

  5. ?>  url


使用curl獲取server.php頁面
spa

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2. $url = 'http://localhost/server.php';  

  3. $param = array('content'=>'fdipzone blog');  

  4.   

  5. $ch = curl_init();  

  6. curl_setopt($ch, CURLOPT_URL, $url);  

  7. curl_setopt($ch, CURLOPT_POST, true);  

  8. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));  

  9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  

  10. $ret = curl_exec($ch);  

  11. $retinfo = curl_getinfo($ch);  

  12. curl_close($ch);  

  13.   

  14. if($retinfo['http_code']==200){  

  15.     $data = json_decode($ret, true);  

  16.     print_r($data);  

  17. }else{  

  18.     echo 'POST Fail';  

  19. }  

  20. ?>  


若是服務沒有安裝php curl擴展,使用file_get_contents也能夠實現發起請求,獲取頁面返回數據

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2. $url = 'http://localhost/server.php';  

  3. $param = array('content'=>'fdipzone blog');  

  4.   

  5. $opt = array(  

  6.     'http' => array(  

  7.         'method' => 'POST',  

  8.         'header' => 'content-type:application/x-www-form-urlencoded',  

  9.         'content' => http_build_query($param)  

  10.     )  

  11. );  

  12.   

  13. $context = stream_context_create($opt);  

  14.   

  15. $ret = file_get_contents($url, false, $context);  

  16.   

  17. if($ret){  

  18.     $data = json_decode($ret, true);  

  19.     print_r($data);  

  20. }else{  

  21.     echo 'POST Fail';  

  22. }  

  23. ?>  


使用curl 和 file_get_contents 返回的結果都是同樣的。

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. Array  

  2. (  

  3.     [content] => fdipzone blog  

  4. )  


對於須要受權的頁面,例如使用了htpasswd+.htaccess設置目錄訪問權限的頁面,直接用上面的方法會返回401 Unauthorized錯誤。

此次的例子先不使用htpasswd+.htaccess來控制訪問權限,而使用 $_SERVER['PHP_AUTH_USER'] 和 $_SERVER['PHP_AUTH_PW']這兩個服務器參數。

想了解htpasswd+.htaccess的朋友,能夠訪問我以前寫的文章 《使用apache htpasswd生成加密的密碼文件,並使用.htaccess控制目錄訪問》


http://localhost/server.php 修改成:

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2. if(!isset($_SERVER['PHP_AUTH_USER']))   

  3. {   

  4.     header('WWW-Authenticate: Basic realm="localhost"');   

  5.     header("HTTP/1.0 401 Unauthorized");   

  6.     exit;   

  7. }else{   

  8.     if (($_SERVER['PHP_AUTH_USER']!= "fdipzone" || $_SERVER['PHP_AUTH_PW']!="654321")) {  

  9.         header('WWW-Authenticate: Basic realm="localhost"');  

  10.         header("HTTP/1.0 401 Unauthorized");  

  11.         exit;  

  12.     }  

  13. }  

  14.   

  15. $content = isset($_POST['content'])? $_POST['content'] : '';  

  16. header('content-type:application/json');  

  17. echo json_encode(array('content'=>$content));  

  18. ?>  


設定賬號:fdipzone 密碼:654321


curl中,有一個參數是 CURLOPT_USERPWD,咱們能夠利用這個參數把賬號密碼在請求時發送過去。

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. curl_setopt($ch, CURLOPT_USERPWD, '賬號:密碼');  


curl請求的程序修改成:

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2. $url = 'http://localhost/server.php';  

  3. $param = array('content'=>'fdipzone blog');  

  4.   

  5. $ch = curl_init();  

  6. curl_setopt($ch, CURLOPT_URL, $url);  

  7. curl_setopt($ch, CURLOPT_POST, true);  

  8. curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));  

  9. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  

  10. curl_setopt($ch, CURLOPT_USERPWD, 'fdipzone:654321'); // 加入這句  

  11. $ret = curl_exec($ch);  

  12. $retinfo = curl_getinfo($ch);  

  13. curl_close($ch);  

  14.   

  15. if($retinfo['http_code']==200){  

  16.     $data = json_decode($ret, true);  

  17.     print_r($data);  

  18. }else{  

  19.     echo 'POST Fail';  

  20. }  

  21. ?>  


而file_get_contents 若是要發送賬號和密碼,須要手動拼接header

file_get_contents 請求的程序修改成:

[php] view plain copy 在CODE上查看代碼片派生到個人代碼片

  1. <?php  

  2. $url = 'http://localhost/server.php';  

  3. $param = array('content'=>'fdipzone blog');  

  4.   

  5. $auth = sprintf('Authorization: Basic %s'base64_encode('fdipzone:654321')); // 加入這句  

  6.   

  7. $opt = array(  

  8.     'http' => array(  

  9.         'method' => 'POST',  

  10.         'header' => "content-type:application/x-www-form-urlencoded\r\n".$auth."\r\n"// 把$auth加入到header  

  11.         'content' => http_build_query($param)  

  12.     )  

  13. );  

  14.   

  15. $context = stream_context_create($opt);  

  16.   

  17. $ret = file_get_contents($url, false, $context);  

  18.   

  19. if($ret){  

  20.     $data = json_decode($ret, true);  

  21.     print_r($data);  

  22. }else{  

  23.     echo 'POST Fail';  

  24. }  

  25. ?>  

相關文章
相關標籤/搜索