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
.
вы можете понюхать, что происходит на проводе? Видеть формат HTTP-запроса, когда он выходит на провод, очень помогло бы.
Не видя этого, я бы предположил, что сервер не очень хорошо реализован и отклоняет запрос HTTP/1.1. Попробуйте установить --http1.0
на Curl и посмотреть, что произойдет...
я столкнулся с той же проблемой, и в моем случае виновником был ошибочный символ новой строки/CRLF в конце URL-адреса запроса, который не попадает в urlencode()
(или, может быть, он кодирует его, но он по-прежнему заставляет сервер производить ошибку). Как только я нашел проблему, запросы снова начали работать, даже без параметров контекста потока.
надеюсь, это поможет другим.
некоторое время мы еще получаем ошибку
file_get_contents($api);
в этом случае попробуйте следующее:
fopen($api,"r");
Я также столкнулся с этой же проблемой.. позже я обнаружил, что при получении результатов из mysql ограничьте $ count , $граф -ве. исправление того, что url работал нормально. Существует некоторая проблема только в url-адресе, а не проблема с версией file_get_contents или http..