curl 或 file_get_contents 获取需要授权页面的方法

百般思念 提交于 2019-12-05 07:54:59

今天因工作需要,需要用 curl / file_get_contents 获取需要授权(Authorization)的页面内容,解决后写了这篇文章分享给大家。


php curl 扩展,能够在服务器端发起POST/GET请求,访问页面,并能获取页面的返回数据。

例如要获取的页面:http://localhost/server.php

[php] view plain copy 在CODE上查看代码片派生到我的代码片

  1. <?php  

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

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

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

  5. ?>  


使用curl获取server.php页面

[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. ?>  



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!