【问题标题】:Getting raw headers with Guzzle Http Client使用 Guzzle Http 客户端获取原始标头
【发布时间】:2015-10-09 16:45:45
【问题描述】:

我有 URL (http://forexample.com/index),我在其中发送原始标头:

header("HTTP/1.1 401 Some message");

我想通过 Guzzle 获取此原始标题消息。不幸的是,请求完成后,我在标头之间找不到此消息:

$client = new GuzzleHttp\Client();

try {
    $res = $client->post( 'http://forexample.com/index' );
} catch ( GuzzleHttp\Exception\BadResponseException $e ) {
    // On HTTP response other than 200 Guzzle throws an exception
    $res = $e->getResponse();
}

var_dump( $res->getHeaders() );

假设我用原生 PHP 函数 get_headers 调用这个 URL:

var_dump( get_headers( 'http://forexample.com/index' ) );

我得到了所有的标题。那么有什么想法吗?

【问题讨论】:

  • 不是你要的HTTP状态码吗?
  • 不,我想得到状态消息 - “一些消息”。
  • 那么你在$res->getReasonPhrase()之后。但是,如果您有状态代码,则绝对不需要原因短语。你不应该依赖这个短语,只依赖状态代码,但你的代码就是你的代码,你做你认为合适的事情。祝你好运。
  • getReasonPhrase 返回“未授权”消息,该消息实际上与响应代码有关。但我需要收到“一些消息”消息:)
  • 这让我们回到我原来的评论 - 你在状态码之后,但问题是你还不知道。查看 Guzzle Response 的来源,似乎必须将任意人类可读的消息传递给它 - 如果没有通过构造函数选项传递任何内容,那么它会使用状态码提取消息。我知道您想要人类可读的短语,但似乎用于处理响应的默认类不会给出远程服务返回的类,而是与带有状态代码的地图对应的类。

标签: php guzzle


【解决方案1】:

Guzzle 为各种代码预定义了状态消息。 See here.

因此,您的消息将根据发送的代码替换为该消息。并且可以通过以下方式获取默认消息,

$res->getReasonPhrase();

更新

我知道为什么我们没有通过$res->getReasonPhrase(); 函数收到“某些消息”。问题(?)在于第 76 行的here

isset($startLine[2]) ? (int) $startLine[2] : null

在上面的行中,$startLine[2] 是您在标题中提供的'Some message',但由于int 转换,导致0 并且由于以下代码here 被默认消息替换。

if (!$reason && isset(self::$phrases[$this->statusCode])) {
    $this->reasonPhrase = self::$phrases[$status];
} else {
    $this->reasonPhrase = (string) $reason;
}

我确信int 转换背后一定有一些原因,但我创建了一个pull request,将int 替换为string,只是想知道它背后是否有任何原因。我希望他们拒绝我的拉取请求并告诉我为什么我错了,int 铸造确实是正确的。

更新

Pull 请求已被接受并合并到 master。所以在未来的版本中这个错误会被修复。

【讨论】:

  • getReasonPhrase 返回“未授权”消息,实际上与响应代码有关。但我需要收到“一些消息”消息:)
  • 谢谢。所以我会接受你的回答并关注你的拉取请求状态。
  • @Bounce Pull 请求已被接受并合并到 master 中!!
  • 是的,我已经看到了。再次感谢;)
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多