在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);//显示获得的数据