2010-05-03 98 views
14

我試圖使用file_get_contents()從服務器獲取響應,並遇到此錯誤。有人能告訴我什麼原因以及如何解決它?代碼的一部分是:HTTP請求失敗! HTTP/1.1 505 HTTP版本不支持錯誤

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message"; 
$resp = file_get_contents($api); 

服務器響應正確,而我粘貼在瀏覽器中的網址。 我知道這是由服務器拒絕客戶端的HTTP版本引起的,但我不知道爲什麼會發生這種情況。

任何幫助,非常感謝。在此先感謝

+0

我在使用'捲曲'時也收到同樣的錯誤。 – shyam 2010-05-03 10:38:49

+0

嘗試用'%24'替換'$'。這可能不是什麼導致你的問題,但你應該適當urlencode你的角色。 – Kylar 2010-05-04 16:34:55

+0

'$'實際上是變量。我找到了導致錯誤的原因,並且它是urlencoding。我沒有注意到早些時候bcos腳本工作的更早,並且在編輯一下後我錯過了這個功能。感謝所有試圖幫助你的人......而且事實上你的回答是在信息的基礎上。 – shyam 2010-05-05 05:01:04

回答

29

我發現這個問題,它是一個簡單的編碼錯誤 - 缺少url編碼。

起初我沒有注意到它的原因是因爲代碼在我做了一些編輯之前就沒有問題了,在調用服務器之前我錯過了urlencode()函數,這導致了url中的空間。

這似乎是大多數人發生此錯誤的原因。因此,如果遇到此問題,請在所有可能包含空格的變量中使用urlencode()作爲URL參數。所以,在我的問題的情況下固定的代碼如下:

$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=" . urlencode($message); 
$resp = file_get_contents($api); 

而且,感謝所有的時間和響應,那些信息。

+0

我給了一個url,並且在它的後面沒有交換空格。這樣做,它爲我修好了。 – 2012-04-30 17:28:55

0

你可以嗅到電線上發生了什麼?看到HTTP請求在線路上發送時的格式會有很大幫助。

沒有看到,我最好的猜測是服務器沒有很好的實現,並拒絕HTTP/1.1請求。嘗試在捲曲設置--http1.0,看會發生什麼......

+0

可否請告訴我如何查看HTTP請求的格式..? – shyam 2010-05-03 10:59:08

+0

你不能這樣做file_get_contents。這是一個非常聰明的取消方法,它不能控制HTTP請求的製作方式。沒有頭文件被返回,除了一個簡單的'GET'外你什麼也做不了。要獲取標題和/或執行其他HTTP請求方法,您必須使用CURL – 2010-05-03 12:51:49

9

你可以create a stream context設置爲1.0的HTTP版本,並使用與file_get_contents這方面:

$options = array(
    'http' => array(
     'protocol_version' => '1.0', 
     'method' => 'GET' 
    ) 
); 
$context = stream_context_create($options); 
$api = "http://smpp5.routesms.com:8080/bulksms/sendsms?username=$username&password=$password&source=$source&destination=$destin&dlr=$dlr&type=$type&message=$message"; 
$resp = file_get_contents($api, false, $context); 

順便說一句:不要忘了逃跑您的URI參數值適用於urlencode

0

我遇到了同樣的問題,在我的情況下,罪魁禍首是一個錯誤的換行符/ CRLF字符在請求URL的末尾,它沒有被urlencode()捕獲(或者它編碼它,但它仍然導致服務器產生錯誤)。一旦發現問題,即使沒有流上下文選項,請求也會再次開始工作。

希望這會幫助他人。

0

有的時候我們還是在這種情況下得到誤差

file_get_contents($api); 

,試試這個:

fopen($api,"r"); 
0

我也面臨着同樣的問題.. 後來我發現,在檢索結果從MySQL,限制$ count, $ count是-ve。修復該網址工作正常。 只有url存在一些問題,它不是file_get_contents或http版本問題。

相關問題