The Response
最后更新于:2022-04-01 04:24:28
# Response
[TOC=2,3]
Your Slim app’s routes and middleware are given a PSR 7 response object that represents the current HTTP response to be returned to the client. The response object implements the [PSR 7 ResponseInterface](http://www.php-fig.org/psr/psr-7/#3-2-1-psr-http-message-responseinterface) with which you can inspect and manipulate the HTTP response status, headers, and body.
## How to get the Response object
The PSR 7 response object is injected into your Slim application routes as the second argument to the route callback like this:
~~~
<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App;
$app->get('/foo', function (ServerRequestInterface $request, ResponseInterface $response) {
// Use the PSR 7 $response object
return $response;
});
$app->run();
~~~
Figure 1: Inject PSR 7 response into application route callback.
The PSR 7 response object is injected into your Slim application *middleware* as the second argument of the middleware callable like this:
~~~
<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
$app = new \Slim\App;
$app->add(function (ServerRequestInterface $request, ResponseInterface $response, callable $next) {
// Use the PSR 7 $response object
return $next($request, $response);
});
// Define app routes...
$app->run();
~~~
Figure 2: Inject PSR 7 response into application middleware.
## The Response Status
Every HTTP response has a numeric [status code](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html). The status code identifies the *type* of HTTP response to be returned to the client. The PSR 7 Response object’s default status code is `200`(OK). You can get the PSR 7 Response object’s status code with the `getStatusCode()`method like this.
~~~
$status = $response->getStatusCode();
~~~
Figure 3: Get response status code.
You can copy a PSR 7 Response object and assign a new status code like this:
~~~
$newResponse = $response->withStatus(302);
~~~
Figure 4: Create response with new status code.
## The Response Headers
Every HTTP response has headers. These are metadata that describe the HTTP response but are not visible in the response’s body. Slim’s PSR 7 Response object provides several methods to inspect and manipulate its headers.
### Get All Headers
You can fetch all HTTP response headers as an associative array with the PSR 7 Response object’s `getHeaders()` method. The resultant associative array’s keys are the header names and its values are themselves a numeric array of string values for their respective header name.
~~~
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
~~~
Figure 5: Fetch and iterate all HTTP response headers as an associative array.
### Get One Header
You can get a single header’s value(s) with the PSR 7 Response object’s `getHeader($name)`method. This returns an array of values for the given header name. Remember, *a single HTTP header may have more than one value!*
~~~
$headerValueArray = $response->getHeader('Vary');
~~~
Figure 6: Get values for a specific HTTP header.
You may also fetch a comma-separated string with all values for a given header with the PSR 7 Response object’s `getHeaderLine($name)` method. Unlike the `getHeader($name)` method, this method returns a comma-separated string.
~~~
$headerValueString = $response->getHeaderLine('Vary');
~~~
Figure 7: Get single header's values as comma-separated string.
### Detect Header
You can test for the presence of a header with the PSR 7 Response object’s`hasHeader($name)` method.
~~~
if ($response->hasHeader('Vary')) {
// Do something
}
~~~
Figure 8: Detect presence of a specific HTTP header.
### Set Header
You can set a header value with the PSR 7 Response object’s `withHeader($name, $value)`method.
~~~
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
~~~
Figure 9: Set HTTP header
Reminder
The Response object is immutable. This method returns a *copy* of the Response object that has the new header value. This method is destructive, and it *replaces* existing header values already associated with the same header name.
### Append Header
You can append a header value with the PSR 7 Response object’s `withAddedHeader($name, $value)` method.
~~~
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
~~~
Figure 10: Append HTTP header
Reminder
Unlike the `withHeader()` method, this method *appends* the new value to the set of values that already exist for the same header name. The Response object is immutable. This method returns a *copy* of the Response object that has the appended header value.
### Remove Header
You can remove a header with the Response object’s `withoutHeader($name)` method.
~~~
$newResponse = $oldResponse->withoutHeader('Allow');
~~~
Figure 11: Remove HTTP header
Reminder
The Response object is immutable. This method returns a *copy* of the Response object that has the appended header value.
## The Response Body
An HTTP response typically has a body. Slim provides a PSR 7 Response object with which you can inspect and manipulate the eventual HTTP response’s body.
Just like the PSR 7 Request object, the PSR 7 Response object implements the body as an instance of `\Psr\Http\Message\StreamInterface`. You can get the HTTP response body`StreamInterface` instance with the PSR 7 Response object’s `getBody()` method. The`getBody()` method is preferable if the outgoing HTTP response length is unknown or too large for available memory.
~~~
$body = $response->getBody();
~~~
Figure 12: Get HTTP response body
The resultant `\Psr\Http\Message\StreamInterface` instance provides the following methods to read from, iterate, and write to its underlying PHP `resource`.
* `getSize()`
* `tell()`
* `eof()`
* `isSeekable()`
* `seek()`
* `rewind()`
* `isWritable()`
* `write($string)`
* `isReadable()`
* `read($length)`
* `getContents()`
* `getMetadata($key = null)`
Most often, you’ll need to write to the PSR 7 Response object. You can write content to the`StreamInterface` instance with its `write()` method like this:
~~~
$body = $response->getBody();
$body->write('Hello');
~~~
Figure 13: Write content to the HTTP response body
You can also *replace* the PSR 7 Response object’s body with an entirely new`StreamInterface` instance. This is particularly useful when you want to pipe content from a remote destination (e.g. the filesystem or a remote API) into the HTTP response. You can replace the PSR 7 Response object’s body with its `withBody(StreamInterface $body)`method. Its argument MUST be an instance of `\Psr\Http\Message\StreamInterface`.
~~~
$newStream = new \GuzzleHttp\Psr7\LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
~~~
Figure 13: Replace the HTTP response body
Reminder
The Response object is immutable. This method returns a *copy* of the Response object that contains the new body.