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