首页 > 网站建设 > 蓝韵观点 > PHP开发 > PHP使用curl模拟浏览器解决跨域问题
PHP使用curl模拟浏览器解决跨域问题

作者:周伯通来源:lanyunwork时间:2017.12.19

在Ajax应用中,请求同一个域名下的url或者说用不带http的绝对路径和相对路径请求是没有任何问题的,如果请求外部资源,那么这就称为跨域请求。由于浏览器同源策略(同源策略, 同源策略防止跨域是浏览器中的安全机制),凡是发送请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。跨域请求虽然返回200,但是不会返回任何数据。

解决跨域问题有很多方法,例如,在服务端填上响应头:

 header('content-type:application:json;charset=utf8'); 
 header('Access-Control-Allow-Origin:*'); /*星号表示所有的域都可以接受,*/ 
 header('Access-Control-Allow-Methods:GET,POST'); 
 header('Access-Control-Allow-Headers:x-requested-with,content-type');

用jsonp的方法。等等。

(网上方法我没有一一测试验证过,我这边讲的是我使用过的一种方法。)

使用curl

使用PHP的cURL库可以简单和有效地去抓网页。你只需要运行一个脚本,然后分析一下你所抓取的网页,然后就可以以程序的方式得到你想要的数据了。CURL是一个非常强大的开源库,支持很多协议,包括HTTP、FTP、TELNET等,我们使用它来发送HTTP请求。它给我 们带来的好处是可以通过灵活的选项设置不同的HTTP协议参数,并且支持HTTPS。CURL可以根据URL前缀是“HTTP” 还是“HTTPS”自动选择是否加密发送内容。

使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤:

 1. 初始化连接句柄;

curl_init()

2. 设置CURL选项;

curl_setopt()

(较为重要,一切玄妙均在此。有一长串cURL参数可供设置,它们能指定URL请求的各个细节。要一次性全部看完并理解可能比较困难,所以今天我们只试一下那些更常用也更有用的选项。)

3.执行并获取结果

curl_exec()

4.释放cURL句柄

curl_close()

使用CURL发送GET请求

发送GET请求的关键是拼装格式正确的URL。请求地址和GET数据由一个“?”分割,然后GET变量的名称和值用“=”分隔,各个GET名称和值由“&”连接。PHP为我们提供了一个函数专门用来拼装GET请求和数据部分——http_build_query,该函数接受一个关联数组,返回由该关联数据描述的GET请求字符串。具体代码如下:

 
  $curl = curl_init();  //初始化 
  curl_setopt($curl, CURLOPT_URL, 'http://www.111.com/receive.php'); //设置抓取的url
  curl_setopt($curl, CURLOPT_HEADER, 1); //设置头文件的信息作为数据流输出 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出。
  $data = curl_exec($curl); //执行命令  
  echo curl_getinfo($curl,CURLINFO_HTTP_CODE); //输出请求状态码  
  curl_close($curl);//关闭URL请求  
  print_r($data);//显示获得的数据  

使用CURL发送POST请求

可以使用CURL提供的选项CURLOPT_POSTFIELDS,设置该选项为POST字符串数据就可以把请求放在正文中。

  $curl = curl_init();//初始化
  url curl_setopt($curl, CURLOPT_URL, 'http://www.111.com/receive.php');//设置抓取的
  curl_setopt($curl, CURLOPT_HEADER, 1);//设置头文件的信息作为数据流输出 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//设置获取的信息以文件流的形式返回,而不是直接输出。
  curl_setopt($curl, CURLOPT_POST, 1); //设置post方式提交 
  $post_data = array( "title" => "1290800466", "content" => "3424243243" );//设置post数据  
  curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);//post提交的数据 
  $data = curl_exec($curl);  //执行命令 
  curl_close($curl); //关闭URL请求 
  print_r($data);//显示获得的数据

 

 

与蓝韵项目经理通话

请输入正确的手机号码格式

信息保护中请放心填写

在线咨询
 
提交成功
关闭浮窗