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

Я пытаюсь использовать 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 ответов

Решение

Я обнаружил проблему, и это была простая ошибка кодирования - отсутствует кодировка 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);

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

Вы можете создать потоковый контекст с версией 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,

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

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

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

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

file_get_contents($api);

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

fopen($api,"r");

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

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

Другие вопросы по тегам