2010-05-03 17 views
14

Estoy tratando de usar file_get_contents() para obtener la respuesta de un servidor y se encontró este error. ¿Podría alguien decirme cuál es el motivo y cómo solucionarlo? La parte del código es:¡Falló la solicitud HTTP! HTTP/1.1 505 HTTP Version No admitido error

$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); 

El servidor respondió correctamente mientras pegué la url en el navegador. Me enteré de que esto se debe a que el servidor rechazó la versión HTTP del cliente, pero no tengo idea de por qué está sucediendo eso en mi caso.

Cualquier ayuda es muy apreciada. Gracias de antemano

+0

Recibo el mismo error al usar 'curl' también. – shyam

+0

Intenta reemplazar tu '$' por '% 24'. Es probable que no sea lo que está causando el problema, pero debes urlencode tus personajes. – Kylar

+0

el '$' es en realidad para la variable. Y he encontrado lo que causó el error, y es urlencoding. No me di cuenta antes de que el script estaba funcionando antes, y me perdí la función después de un poco de edición. Gracias a todas las personas que intentaron ayudar ... y de hecho, sus respuestas fueron informativas. – shyam

Respuesta

29

Encontré el problema, y ​​era un error de codificación simple - faltaba la codificación de URL.

La razón por la que no me di cuenta al principio era porque el código estaba bien antes de editar, y había perdido la función urlencode() antes de llamar al servidor, lo que causaba un espacio en la url.

Este parece ser el motivo por el que este error se produce para la mayoría de las personas. Entonces, si se encuentra con esto, use urlencode() en todas las variables que puedan contener espacios en blanco en su valor usado como parámetros de URL. Así, en el caso en mi pregunta del código fijo se verá así:

$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); 

También, gracias por todo su tiempo y respuestas, esas eran informativo.

+0

Recibí una url y no he intercambiado espacios en la última parte. Lo hizo y lo arregló para mí. –

0

¿Puedes oler lo que está pasando en el cable? Ver el formato de la solicitud HTTP mientras sale en el cable ayudaría mucho.

Sin ver eso, mi mejor opción sería que el servidor no está bien implementado, y está rechazando una solicitud de HTTP/1.1. Prueba a poner en --http1.0 Curl y ver lo que pasa ...

+0

¿podría decirme cómo ver el formato de la solicitud HTTP ...? – shyam

+0

No puede hacerlo con file_get_contents. Es un método de captación extremadamente cerebral que no le da control sobre cómo se realiza la solicitud HTTP. No se devuelven los encabezados, y no se puede hacer otra cosa que un simple 'GET'. Para obtener encabezados y/o hacer otros métodos de solicitud HTTP, tendrá que usar CURL –

9

Usted podría create a stream context con la versión HTTP ajustado a 1.0 y utilizar ese contexto con 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); 

Por cierto: No se olvide de escapar su argumento URI valora correctamente con urlencode.

0

Me encontré con el mismo problema y en mi caso el culpable era un carácter errante de nueva línea/CRLF al final de la URL de solicitud, que no queda atrapado por urlencode() (o tal vez lo codifica pero todavía causa el servidor para producir el error). Una vez que encontré el problema, las solicitudes comenzaron a funcionar nuevamente, incluso sin las opciones de contexto de transmisión.

Esperemos que esto ayude a los demás.

0

algún tiempo todavía nos llegan de error con

file_get_contents($api); 

en ese caso, intente lo siguiente:

fopen($api,"r"); 
0

También estaba frente a este mismo tema .. más tarde me di cuenta de que al recuperar los resultados de mysql, límite de $ count, $ count was -ve. arreglando que la url funcionó bien. Hay algunos problemas solo en la URL, y no es un problema de versión de archivo_get_contents o http ..

Cuestiones relacionadas