2009-09-18 20 views
10

Używam PHP do przeanalizowania numerycznej części odpowiedzi kodu stanu HTTP. Biorąc pod uwagę standardową odpowiedź "HTTP/1.1 200 OK", użyłbym:Analizowanie kodu stanu HTTP

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

Nie jestem ekspertem od HTTP. Czy kiedykolwiek spotkałbym się z odpowiedzią, w której kod nie znajduje się na pozycji $ data [1] jak w powyższym przykładzie? Po prostu chcę mieć pewność, że ta metoda wytyczania kodu odpowiedzi zawsze zadziała dla każdej odpowiedzi.

Dzięki, Brian

+2

jeśli używasz cURL możesz być podobny: curl_getinfo ($ ch, CURLINFO_HTTP_CODE); który zwróci 200 lub jakikolwiek będzie stan http. – Mickey

Odpowiedz

14

W razie wątpliwości sprawdź specyfikację. Specyfikacja w tym przypadku dla HTTP/1.1 to RFC2616. W Section 6.1 to opisuje Stan-Line, pierwszy komponent Response, jak:

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

To jest - przestrzeń pojedynczy ASCII (SP) należy oddzielić HTTP wersja i Kod statusu - a jeśli sprawdzisz definicję HTTP-Version (w Section 3.1), to nie może zawierać spacji, ani kod Status-Code.

Więc dobrze jest iść z tym kodem.

+0

Dziękuję bardzo – Brian

6

Nie, nigdy nie wystąpi odpowiedź (jeśli jest to właściwe odpowiedzi HTTP), który ma inny format. Zobacz HTTP RFC (2616).

+1

Zobacz 6.1 Status-Line zarówno w RFC 2616 (http 1.1) i RFC 1945 (http 1.0). Oba zapewniają ten 3-częściowy, rozdzielany spacjami format. – mjv

1

Nie, to, co robisz, jest OK, jeśli chcesz tylko numerycznej. Jeśli jednak chcesz otrzymać wiadomość, to również ją podzielisz, tj.

HTTP/1.1 404 Not Found 
+2

Aby temu zapobiec, używam opcjonalnego argumentu '$ limit' takiego jak: ' $ aHttpResp = explode ('', HttpComm :: $ headers [0], 3); \t \t \t \t \t // HTTP/1.x ccc ~ długi opis odpowiedzi ~ – grantwparks

6

No jeśli serwer WWW spełniają normy robi eksplodować i buforowanie drugi element tablicy jest w porządku

jeśli naprawdę chce mieć pewność użyć wyrażenia regularnego

tj

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

Pozdrawiam

Powiązane problemy