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
на керл и посмотрим что получится...