响应正文

HTTP 响应通常具有正文。

与 PSR-7 请求对象一样,PSR-7 响应对象将正文实现为 Psr\Http\Message\StreamInterface 的实例。你可以使用 PSR-7 响应对象的 getBody() 方法获取 HTTP 响应正文的 StreamInterface 实例。如果传出的 HTTP 响应长度未知或太大而无法放入内存中,getBody() 方法更可取。

$body = $response->getBody();

返回的 Psr\Http\Message\StreamInterface 实例提供以下方法来读取、迭代和写入其底层 PHP resource

  • getSize()
  • tell()
  • eof()
  • isSeekable()
  • seek()
  • rewind()
  • isWritable()
  • write($string)
  • isReadable()
  • read($length)
  • getContents()
  • getMetadata($key = null)

通常情况下,你需要向 PSR-7 响应对象写入内容。你可以使用 write() 方法将内容写入 StreamInterface 实例,如下所示:

$body = $response->getBody();
$body->write('Hello');

你还可以使用全新的 StreamInterface 实例替换 PSR-7 响应对象的正文。当你想将内容从远程位置(例如文件系统或远程 API)导入到 HTTP 响应中时,这特别有用。你可以使用 withBody(StreamInterface $body) 方法替换 PSR-7 响应对象的正文。其参数必须Psr\Http\Message\StreamInterface 的实例。

use GuzzleHttp\Psr7\LazyOpenStream;

$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);

Info

Response 对象是不可变的。该方法返回一个新的 Response 对象副本,其中包含新的正文。