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