12

REST API に対して oauth 署名付きリクエストを作成し、次のような配列にレスポンス ヘッダーを配置しました。

[0] => HTTP/1.1 200 OK
[1] => Cache-Control: private
[2] => Transfer-Encoding: chunked
[3] => Content-Type: text/html; charset=utf-8
[4] => Content-Location: https://***
[5] => Server: Microsoft-IIS/7.0
[6] => Set-Cookie: ASP.NET_SessionId=***; path=/; HttpOnly
[7] => X-AspNetMvc-Version: 2.0
[8] => oauth_token: ***
[9] => oauth_token_secret: ***
[10] => X-AspNet-Version: 4.0.30319
[11] => X-Powered-By: ASP.NET
[12] => Date: Sat, 15 Sep 2012 02:01:15 GMT

HTTP ステータス コード、Content-Location、oauth_token、oauth_token_secret などの項目を簡単に取得するためにヘッダーを解析する方法を見つけようとしています。

4

7 に答える 7

12

配列を反復処理し、stripos()探しているヘッダーを見つけるためにチェックする必要があります。ほとんどの場合、explode()(:結果の 2 つの部分に限定して) 次に進みますが、HTTP 応答コードでは、スペースで爆発する必要があります。

// Get any header except the HTTP response...
function getResponseHeader($header, $response) {
  foreach ($response as $key => $r) {
     // Match the header name up to ':', compare lower case
     if (stripos($r, $header . ':') === 0) {
        list($headername, $headervalue) = explode(":", $r, 2);
        return trim($headervalue);
     }
  }
}
// example:
echo getResponseHeader("Content-Type");
// text/html; charset=utf-8

// Get the HTTP response code
foreach ($response as $key => $r) {
  if (stripos($r, 'HTTP/') === 0) {
    list(,$code, $status) = explode(' ', $r, 3);
    echo "Code: $code, Status: $status";
    break;
  }
}
于 2012-09-15T02:15:49.427 に答える
9

のないヘッダー:は HTTP のバージョンとステータスだけのようです。それarray_shiftを抽出するために実行し、次のように配列を作成して他のものを反復処理します。

$parsedHeaders = array();
foreach ($headers as $header) {
    if (! preg_match('/^([^:]+):(.*)$/', $header, $output)) continue;
    $parsedArray[$output[1]] = $output[2];
}

ps: テストされていません。

— 編集 —</p>

楽しい ;)

/**
 * Parse a set of HTTP headers
 *
 * @param array The php headers to be parsed
 * @param [string] The name of the header to be retrieved
 * @return A header value if a header is passed;
 *         An array with all the headers otherwise
 */
function parseHeaders(array $headers, $header = null)
{
    $output = array();

    if ('HTTP' === substr($headers[0], 0, 4)) {
        list(, $output['status'], $output['status_text']) = explode(' ', $headers[0]);
        unset($headers[0]);
    }

    foreach ($headers as $v) {
        $h = preg_split('/:\s*/', $v);
        $output[strtolower($h[0])] = $h[1];
    }

    if (null !== $header) {
        if (isset($output[strtolower($header)])) {
            return $output[strtolower($header)];
        }

        return;
    }

    return $output;
}
于 2012-09-15T02:17:14.563 に答える
2

pecl_http がある場合の簡単な回答: http://php.net/manual/it/function.explode.php

少し長い答え:

$header = "...";
$parsed = array_map(function($x) { return array_map("trim", explode(":", $x, 2)); }, array_filter(array_map("trim", explode("\n", $header))));
于 2013-10-14T15:22:00.043 に答える