Ошибка 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.