如何使用带HEADERS的Curl


How to use Curl with HEADERS?

我试过这样做,但不起作用!

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('GET /search?q=kk HTTP/1.1
Host: www.google.de
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Proxy-Connection: Close
Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334:
Cache-Control: max-age=0
Connection: Close
'));
$response = curl_exec($ch); 
curl_close($ch);   

    echo $response;

此外,是否可以在不设置URL的情况下只使用标头来完成整个请求?我是说没有这个?

curl_setopt($ch, CURLOPT_URL, "http://google.com/"); 

谢谢!

我开始工作了。

1) 将标题Host: www.google.de更改为Host: www.google.com

动机:Host标头中指定的主机应该与URL的主机完全匹配。

2) 使用"www.google.com"而不是"google.com"

动机:谷歌的搜索请求不会检索到搜索结果。你会被告知访问www.google.com。

3) 将完整URL设置为CURLOPT_URL,而不仅仅是主机名。例如,将CURLOPT_URL更改为curl_setopt($ch, CURLOPT_URL, "http://www.google.com/search?q=kk");

动机:正确使用cURL API。

4) 从CURLOPT_HTTPHEADER中删除GET /search?q=kk HTTP/1.1--它放错地方了。

动机:正确使用cURL API。

5) 响应将是gzip或deflate压缩。要停止此操作,请删除Accept-Encoding: gzip, deflate请求标头。

动机:如果你告诉谷歌你有能力收到压缩回复,他们会给你发一个。解压缩HTTP响应是一个额外的步骤,您可能不想执行。如果响应是未压缩的文本形式,那么处理它可能会更容易。

为了补充其他海报所说的内容,您也不能在CURLOPT_HTTPHEADER数组中粘贴GET命令,因为这是在其他cURL选项中指定的。cURL意味着使用CCD_ 9函数来操作;您不能通过将HTTP消息放在headers部分来绕过它。例如,为了确保您的命令是HTTP GET操作,您将CURLOPT_HTTPGET设置为TRUE(尽管默认情况下cURL将发送GET,直到您将其更改为其他内容)。

为了解决您为什么无法访问正确的URL的问题,这是因为您需要在CURLOPT_URL中指定整个路径名,而不仅仅是主机。因此,您实际上应该编写curl_setopt($ch, CURLOPT_URL, "http://google.de/search?q=kk HTTP/1.1");来设置URL。

此外,我不知道为什么要在GET请求的HTTP头中放入Connection: Close。在这个标题中,你告诉谷歌你正在关闭你的连接。;这是由curl_close($ch);处理的,所以忘记那个标头。事实上,HTTP头中有一半的项目没有位置。例如,为什么要在请求中发送cookie以获取搜索结果?在发送之前,请确保您知道每个标头的作用。否则,您绝对无法判断是否发送了正确的标头。

您遇到了一些问题,但它们应该很容易解决。首先,您将头中的主机设置为与URL请求中的主机不同,但由于您正在执行HTTP1.0,因此无论如何都不需要这样做。

其次,HTTPHEADER中的每一行都需要作为数组中自己的行,并且不包括GET行。

curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-gb,en;q=0.5',
    'Accept-Encoding: gzip, deflate',
    'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
    'Proxy-Connection: Close',
    'Cookie: PREF=ID=2bb051bfbf00e95b:U=c0bb6046a0ce0334:',
    'Cache-Control: max-age=0',
    'Connection: Close'
));

(很明显,您从Firefox和旧版本中窃取了这一点,但我们将听之任之。)最后,是的,您必须指定CURLOPT_URL,这正是cURL API的设计方式。

如果您需要对生成的HTTP请求进行如此高级别的控制,我建议您使用原始套接字函数手动发送请求。手册中甚至有一个使用fsockets进行HTTP请求的例子:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />'n";
} else {
    $out = "GET / HTTP/1.1'r'n";
    $out .= "Host: www.example.com'r'n";
    $out .= "Connection: Close'r'n'r'n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

下次您应该更仔细地阅读精细手册。有一个如何添加字段的示例:array('Content-type: text/plain', 'Content-length: 100'),不是一个字符串中的所有内容,而是字段是单独的数组元素。