Разбор кода состояния HTTP

Я использую PHP для анализа числовой части ответа кода состояния HTTP. Учитывая стандартный ответ «HTTP/1.1 200 OK», я бы использовал:

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

Я не эксперт по HTTP. Встречу ли я когда-нибудь ответ, в котором код не находится в позиции $data[1], как в приведенном выше примере? Я просто хочу быть уверен, что этот метод разграничения кода ответа всегда будет работать для любого ответа.

Спасибо, Брайан


person Brian    schedule 18.09.2009    source источник
comment
если вы используете cURL, вы можете выглядеть так: curl_getinfo($ch,CURLINFO_HTTP_CODE); который вернет 200 или любой другой статус http.   -  person Mickey    schedule 18.09.2009


Ответы (4)


Если вы сомневаетесь, проверьте спецификацию. Спецификация в данном случае для HTTP/1.1 — RFC2616. В разделе 6.1 описывается строка состояния , первый компонент Response, например:

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

То есть - один пробел ASCII (SP) должен разделять HTTP-версию и код состояния - и если вы проверите определение HTTP-версии< /em> (в Раздел 3.1) он не может включать пробел, как и код состояния.

Итак, вы можете использовать этот код.

person caf    schedule 18.09.2009

Нет, если веб-сервер соблюдает стандарты, делающие взрыв и кэширование второго элемента массива в порядке.

если вы действительно хотите быть уверены, используйте регулярное выражение

i.e.

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

Ваше здоровье

person RageZ    schedule 18.09.2009

Нет, вы никогда не встретите ответ (если это правильный ответ HTTP), который имеет другой формат. См. HTTP RFC (2616).

person David Z    schedule 18.09.2009
comment
См. 6.1 Строка состояния в RFC 2616 (http 1.1) и RFC 1945 (http 1.0). Они оба обеспечивают это 3 части, формат с разделителями-пробелами. - person mjv; 18.09.2009

Нет, то, что вы делаете, в порядке, если все, что вам нужно, это числовое значение. Однако, если вы также хотите получить сообщение, вы также его разделите, т.е.

HTTP/1.1 404 Not Found
person Matthew Scharley    schedule 18.09.2009
comment
Чтобы предотвратить это, я использую необязательный аргумент $limit, например: $aHttpResp = explode(' ', HttpComm::$headers[0], 3); // HTTP/1.x ccc ~long description of the response~ - person grantwparks; 22.10.2009