2012-03-02 87 views
4

我試過做這樣的事情,但它不起作用!如何將curl與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/"); 

謝謝!

+0

你是否試圖在setopt()中隱式設置一個數組?或不同的東西? – Xailor 2012-03-02 19:51:13

+0

爲什麼不使用手冊中解釋的逗號分隔標題選項? – Dan 2012-03-02 19:53:38

+0

喜歡如何? @擔? – Blank 2012-03-02 20:00:16

回答

4

我得到它的工作。

1)更改標題Host: www.google.deHost: www.google.com

動機:在Host頭應該完全匹配的URL的主機指定的主機。

2)使用 「www.google.com」,而不是 「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請求標頭。

動機:如果您告訴Google您有能力收到壓縮的回覆,他們會向您發送一封回覆。解壓縮HTTP響應是您可能不想採取的額外步驟。如果處於未壓縮的文本形式,處理響應可能更容易。

1

如果您需要對生成的HTTP請求進行如此高級別的控制,我建議使用raw socket functions來手動發送請求。該手冊甚至有一個使用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); 
} 
+0

Fsockopen已禁用。這就是爲什麼我使用捲曲! – Blank 2012-03-02 19:59:19

1

你應該在下次更仔細的閱讀精細的手冊。有一個示例如何添加字段:array('Content-type: text/plain', 'Content-length: 100'),而不是一個字符串中的所有內容,但是字段是單獨的數組元素。

2

你有幾個問題,但他們應該很容易理清。首先,您將標頭中的主機設置爲與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,這只是捲曲API的設計方式。

4

要添加到其他海報中所說的內容,您也不能在CURLOPT_HTTPHEADER數組中粘貼GET命令,因爲這是在其他cURL選項中指定的。 cURL旨在使用curl_setopt函數進行操作;您不能通過將HTTP消息放入標題部分來繞過它。例如,要確保您的命令是HTTP GET操作,請將CURLOPT_HTTPGET設置爲TRUE(儘管默認情況下cURL將發送GET,直到您將其更改爲其他內容爲止)。

爲了解決你爲什麼不能到達正確的URL的問題,那是因爲你需要在CURLOPT_URL中指定整個路徑名,而不僅僅是主機。所以,你真的應該寫curl_setopt($ch, CURLOPT_URL, "http://google.de/search?q=kk HTTP/1.1");來設置網址。

此外,我不知道爲什麼你在請求的GET請求的HTTP標頭中放入Connection: Close。在該標題中,您告訴Google您正在關閉您的連接。這是由curl_close($ch);處理的,所以忘了那個標題。事實上,HTTP頭中的一半項目沒有位置。例如,你爲什麼要發送一個cookie來獲取搜索結果?確保在發送之前知道每個標頭的功能。否則,您無法確定您是否發送了正確的標題。

相關問題