HTTP-запрос не выполнен! HTTP / 1.1 505 Ошибка версии HTTP не поддерживается - PullRequest
14 голосов
/ 03 мая 2010

Я пытаюсь использовать file_get_contents() для получения ответа от сервера, и возникла эта ошибка. Может кто-нибудь сказать мне, в чем причина и как это исправить? Часть кода:

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

Сервер ответил правильно, когда я вставил URL в браузер. Я узнал, что это вызвано тем, что сервер отклонил клиентскую версию HTTP, но я понятия не имею, почему это происходит в моем случае.

Любая помощь очень ценится. Заранее спасибо

Ответы [ 6 ]

30 голосов
/ 05 мая 2010

Я нашел проблему, и это была простая ошибка кодирования - отсутствует кодировка URL.

Причина, по которой я сначала этого не заметил, заключалась в том, что код был в порядке до того, как я сделал какое-то редактирование, и я пропустил функцию urlencode() до вызова сервера, что вызвало пробел в URL. 1005 *

Кажется, именно поэтому эта ошибка возникает у большинства людей. Поэтому, если вы столкнулись с этим, используйте 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);

Кроме того, спасибо за ваше время и ответы, они были информационными.

9 голосов
/ 03 мая 2010

Вы можете создать потоковый контекст с версией HTTP, установленной на 1.0, и использовать этот контекст с 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 голосов
/ 27 июня 2013

Я тоже столкнулся с этой же проблемой .. позже я обнаружил, что при получении результатов из mysql, Limit $ count, $ count был -ve. фиксируя, что URL работал нормально. Существует некоторая проблема только в URL-адресе, и это не проблема file_get_contents или версии http.

0 голосов
/ 28 августа 2012

Некоторое время мы все еще получаем ошибку с

file_get_contents($api);

в этом случае попробуйте это:

fopen($api,"r");
0 голосов
/ 07 сентября 2011

Я столкнулся с той же проблемой, и в моем случае виновником был ошибочный символ перевода строки / CRLF в конце URL-адреса запроса, который не попадает на urlencode() (или, возможно, он кодирует его, но все равно вызывает сервер выдает ошибку). Как только я обнаружил проблему, запросы снова начали работать, даже без параметров контекста потока.

Надеюсь, это поможет другим.

0 голосов
/ 03 мая 2010

Можете ли вы понюхать, что происходит на проводе? Просмотр формата HTTP-запроса по мере его поступления очень помог бы.

Не видя этого, я думаю, что сервер не реализован должным образом и отклоняет запрос HTTP / 1.1. Попробуйте установить --http1.0 на Curl и посмотреть, что произойдет ...

...