繁体   English   中英

使用PSR-7发出回应

[英]Emit a response with PSR-7

我试图了解PSR-7的工作原理,但我被卡住了! 这是我的代码:

$app->get('/', function () {
    $stream = new Stream('php://memory', 'rw');
    $stream->write('Foo');
    $response = (new Response())
        ->withHeader('Content-Type', 'text/html')
        ->withBody($stream);
});

我的Response对象是build,但是现在我想发送它... PSR-7如何发送响应? 我需要序列化吗? 我可能错过了一件事...

Psr-7只是模拟http消息。 它没有发送响应的功能。 您需要使用另一个使用PSR-7消息的库。 您可以看一下zend的可控性或类似的东西

就算完成了,即使问题已经超过两年了:

响应是服务器发送到客户端的HTTP消息,是客户端到服务器的请求的结果。

客户期望一个字符串作为消息,由以下内容组成:

  • 状态行 ”(格式为HTTP/<protocol-version> <status-code> <reason-phrase> );
  • 标头列表(每个标头的形式为“ <header-name>: <comma-separ.-header-values> ”);
  • 空行;
  • 消息正文 (字符串)。

它看起来像这样(请参阅PSR-7 ):

HTTP/1.1 200 OK
Content-Type: text/html
vary: Accept-Encoding

This is the response body

为了发出响应,实际上必须执行三个操作:

  1. “状态行”发送到客户端(使用header() PHP函数)。
  2. 标头列表发送到客户端( dito )。
  3. 输出消息正文。

棘手的部分由第三步操作表示。 实现ResponseInterface的类的实例包含一个流对象作为消息主体。 并且此对象必须转换为字符串并打印。 该任务可以轻松完成,因为该流是实现StreamInterface的类的实例,而该类又强制执行了神奇方法__toString()的定义。

因此,通过执行前两个步骤并将输出函数( echoprint_r等)应用于响应实例的getBody()方法的结果,可以完成发射过程。

<?php
if (headers_sent()) {
    throw new RuntimeException('Headers were already sent. The response could not be emitted!');
}

// Step 1: Send the "status line".
$statusLine = sprintf('HTTP/%s %s %s'
        , $response->getProtocolVersion()
        , $response->getStatusCode()
        , $response->getReasonPhrase()
);
header($statusLine, TRUE); /* The header replaces a previous similar header. */

// Step 2: Send the response headers from the headers list.
foreach ($response->getHeaders() as $name => $values) {
    $responseHeader = sprintf('%s: %s'
            , $name
            , $response->getHeaderLine($name)
    );
    header($responseHeader, FALSE); /* The header doesn't replace a previous similar header. */
}

// Step 3: Output the message body.
echo $response->getBody();
exit();

PS:对于大量数据,最好使用php://temp流而不是php://memory 是原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM