2009-09-18 20 views
10

Sto usando PHP per analizzare la parte numerica della risposta codice di stato HTTP. Data una risposta standard "HTTP/1.1 200 OK", userei:di analisi codice di stato HTTP

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

Non sono un esperto di HTTP. Avrò mai una risposta in cui il codice non è nella posizione di $ data [1] come nell'esempio sopra? Voglio solo essere sicuro che questo metodo di delimitazione del codice di risposta funzionerà sempre per qualsiasi risposta.

Grazie, Brian

+2

Se la vostra utilizzando cURL si potrebbe essere come: curl_getinfo ($ ch, CURLINFO_HTTP_CODE); che restituirà 200 o qualunque sia lo stato http. – Mickey

risposta

14

In caso di dubbio, verificare le specifiche. La specifica in questo caso, per HTTP/1.1, è RFC2616. In Section 6.1, descrive il Stato-Line, il primo componente di una risposta, come:

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

che è - uno spazio singolo ASCII (SP) deve separare il HTTP-Version e la Codice di stato - e se si controlla la definizione di versione HTTP (in Section 3.1) non è possibile includere uno spazio e nemmeno il codice di stato .

Così si sono buoni per andare con quel codice.

+0

Grazie mille – Brian

6

No, non si sarebbe mai incontrare una risposta (se si tratta di una risposta HTTP appropriata), che ha un formato diverso. Vedi lo HTTP RFC (2616).

+1

Vedere 6.1 Status-Line in entrambi RFC 2616 (http 1.1) e RFC 1945 (http 1.0). Entrambi garantiscono questo 3 parti, formato delimitato dallo spazio. – mjv

1

No, quello che stai facendo è OK se tutto quello che volete è il valore numerico. Se tuttavia vuoi anche il messaggio, finirai per dividerlo, ad es.

HTTP/1.1 404 Not Found 
+2

Per evitare ciò, utilizzo l'argomento opzionale '$ limit' come: ' $ aHttpResp = explode ('', HttpComm :: headers [0], 3); \t \t \t \t \t \t // HTTP/1.x ccc ~ lunga descrizione della risposta ~ ' – grantwparks

6

No se il server web rispetta le norme facendo un esplodono e la memorizzazione nella cache il secondo elemento della matrice è bene

se si vuole davvero essere l'uso sicuro un'espressione regolare

cioè

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

Cheers

Problemi correlati