2009-09-18 17 views
10

Estoy usando PHP para analizar la porción numérica de la respuesta del código de estado HTTP. Dada una respuesta estándar "HTTP/1.1 200 OK", utilizaría:Analizando el código de estado HTTP

$data = explode(' ', "HTTP/1.1 200 OK"); 
$code = $data[1]; 

No soy un experto en HTTP. ¿Alguna vez encontraría una respuesta donde el código no está en la posición de $ data [1] como en el ejemplo anterior? Solo quiero asegurarme de que este método de delimitación del código de respuesta siempre funcione para cualquier respuesta.

Gracias, Brian

+2

si usa cURL puede ser como: curl_getinfo ($ ch, CURLINFO_HTTP_CODE); que devolverá 200 o cualquiera que sea el estado de http. – Mickey

Respuesta

14

En caso de duda, verifique la especificación. La especificación en este caso, para HTTP/1.1, es RFC2616. En Section 6.1, se describe la Estado-Line, el primer componente de un Respuesta, como:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF 

Eso es - un espacio único ASCII (SP) debe separar el HTTP-Versión y la Código de estado - y si verifica la definición de HTTP-Version (en Section 3.1) no puede incluir un espacio, y tampoco puede el Código de estado.

Así que es bueno ir con ese código.

+0

Muchas gracias – Brian

6

No, nunca se encontraría una respuesta (si se trata de una respuesta adecuada HTTP) que tiene un formato diferente. Vea el HTTP RFC (2616).

+1

Ver 6.1 Status-Line en ambos RFC 2616 (http 1.1) y RFC 1945 (http 1.0). Ambos aseguran este formato de 3 partes, delimitado por espacios. – mjv

1

No, lo que está haciendo está bien si todo lo que quiere es el número. Si también quiere el mensaje, terminará dividiéndolo también, es decir.

HTTP/1.1 404 Not Found 
+2

Para evitar eso, utilizo el argumento opcional '$ limit' como: ' $ aHttpResp = explode ('', HttpComm :: $ headers [0], 3); \t \t \t \t \t \t // HTTP/1.x ccc ~ descripción larga de la respuesta ~ ' – grantwparks

6

No se si el servidor web respetar las normas haciendo un explotar y almacenamiento en caché el segundo elemento de la matriz está bien

si realmente quiere estar seguro de utilizar una expresión regular

es decir

preg_match('|HTTP/\d\.\d\s+(\d+)\s+.*|',$subject,$match); 
var_dump($match[1]); 

Cheers

Cuestiones relacionadas