2010-05-03 18 views
14

Próbuję użyć file_get_contents(), aby uzyskać odpowiedź z serwera i napotkano ten błąd. Czy ktoś może mi powiedzieć, co jest przyczyną i jak to naprawić? Część kodu to:Żądanie HTTP nie powiodło się! HTTP/1.1 505 HTTP Version Not Supported error

$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); 

Serwer odpowiedział poprawnie podczas wklejenia adresu URL w przeglądarce. Dowiedziałem się, że jest to spowodowane przez serwer odrzucający wersję HTTP klienta, ale nie mam pojęcia, dlaczego tak się dzieje w moim przypadku.

Każda pomoc jest doceniana. Z góry dziękuję

+0

Otrzymuję ten sam błąd podczas używania "curl". – shyam

+0

Spróbuj zastąpić "$" przez "% 24". Prawdopodobnie nie jest to przyczyną problemu, ale powinieneś poprawnie zakodować znaki. – Kylar

+0

'$' jest w rzeczywistości dla zmiennej. I znalazłem, co spowodowało błąd, i to jest kodowanie urny. Nie zauważyłem, że wcześniej bcos skrypt działał wcześniej, a ja po prostu pominąłam funkcję po edycji. Dziękuję wszystkim, którzy starali się pomóc ... i rzeczywiście waszym odpowiedziom, jeśli chodzi o informacje. – shyam

Odpowiedz

29

Znalazłem problem i był to prosty błąd kodowania - brak kodowania adresu URL.

Powodem, dla którego nie zauważyłem tego na początku było to, że kod był w porządku, zanim wykonałem jakąś edycję, i przed wywołaniem serwera straciłem funkcję urlencode(), co spowodowało spację w adresie URL.

To wydaje się być przyczyną tego błędu dla większości ludzi. Więc jeśli napotkasz to, użyj urlencode() dla wszystkich zmiennych, które mogą zawierać białe spacje w jego wartości używanej jako parametry URL. W takim przypadku w moim pytaniu poprawny kod będzie wyglądał następująco:

$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); 

Ponadto, dzięki za cały twój czas i odpowiedzi, były to informacje.

+0

Podałem adres URL i nie zamieniłem spacji w jego drugiej części. Zrobiłem to i naprawiłem to dla mnie. –

0

Czy możesz wąchać to, co dzieje się na drucie? Zrozumienie formatu żądania HTTP po wyjściu z przewodu bardzo by pomogło.

Bez tego, moim zdaniem, serwer nie jest dobrze zaimplementowany i odrzuca żądanie HTTP/1.1. Spróbuj ustawić --http1.0 na Curl i widząc, co się dzieje ...

+0

czy możesz mi powiedzieć, jak wyświetlić format żądania HTTP ..? – shyam

+0

Nie można tego zrobić za pomocą file_get_contents. Jest to niezwykle metoda pobierania braindead, która nie daje żadnej kontroli nad tym, jak tworzone jest żądanie HTTP. Żadne nagłówki nie są zwracane i nie można zrobić nic poza prostym "GET". Aby uzyskać nagłówki i/lub inne metody żądania HTTP, musisz użyć CURL –

9

mogli Państwo create a stream context z wersją HTTP ustawiony na 1,0 i użyć tego kontekstu z 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); 

Nawiasem mówiąc: Nie zapomnij, aby uciec wartości argumentu URI poprawnie z urlencode.

0

Wpadłem na ten sam problem iw moim przypadku sprawcą był błędny znak nowej linii/CRLF na końcu adresu URL żądania, który nie został złapany przez urlencode() (lub może go kodował, ale nadal powoduje serwer do wygenerowania błędu). Po znalezieniu problemu żądania ponownie zaczęły działać, nawet bez opcji kontekstowych strumienia.

Mam nadzieję, że to pomoże innym.

0

Jakiś czas wciąż się błąd z

file_get_contents($api); 

w tym przypadku, spróbuj tego:

fopen($api,"r"); 
0

Byłem też w obliczu tego samego problemu .. później okazało się, że podczas pobierania wyników od mysql, Limit $ count, $ count było -ve. ustalenie, że adres URL działa dobrze. Wystąpił problem tylko w adresie URL, a nie jest to problem z plikiem file_get_contents lub http version ..

Powiązane problemy