04 - PSR-7 HTTP Ответ
Обзор
Phalcon\Http\Message\Response является реализацией интерфейса обмена сообщениям HTTP PSR-7 , как определено в PHP-FIG.
Phalcon\Http\Message\Response представляет собой исходящий ответ на стороне сервера. Согласно спецификации HTTP, этот интерфейс включает свойства для каждого из следующего:
- Версия протокола
- Код состояния и фраза причины
- Заголовки
- Тело сообщения
ПРИМЕЧАНИЕ: В приведенных ниже примерах
$httpClient- это клиент по вашему выбору, который реализует PSR-7.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$response = new Response();
$payload = [
'code' => 2000,
'status' => 'success',
'payload' => [
'id' => 12345,
'name' => 'John Doe',
]
];
$stream = new Stream('php://memory', 'wb');
$stream->write(json_encode($payload));
$response = $response
->withHeader('Content-Type', 'application/json')
->withBody($stream)
->withStatus(200)
;
$result = $httpClient->send($response);
$payload = 'The above copyright notice and this permission '
. 'notice shall be included in all copies or '
. 'substantial portions of the Software.'
;
$response = $response
->withHeader('Content-Type', 'text/html')
->withBody($payload)
->withStatus(200)
;
$result = $httpClient->send($response);
Мы создаем новый объект Phalcon\Http\Message\Response с полезной нагрузкой, представленной в виде JSON, необходимыми заголовками и кодом состояния. Затем клиент отправляет ответ обратно, используя объект запроса.
Приведенный выше пример может быть реализован только с использованием параметров конструктора:
<?php
use Phalcon\Http\Message\Response;
$payload = [
'code' => 2000,
'status' => 'success',
'payload' => [
'id' => 12345,
'name' => 'John Doe',
]
];
$request = new Response(
json_encode($payload),
200,
[
'Content-Type' => 'application/json',
]
);
$result = $httpClient->send($request);
Созданный объект Phalcon\Http\Message\Response является неизменным, то есть он никогда не изменится. Любой вызов методов с префиксом with* вернет клон объекта для сохранения неизменности в соответствии со стандартом.
Конструктор
public function __construct(
[mixed $body = "php://temp"
[, int $code = 200
[, array $headers = [] ]]]
)
Конструктор принимает параметры, позволяющие создать объект с определенными заполненными свойствами. Вы можете определить тело, код состояния, а также заголовки. Все параметры являются необязательными.
body- по умолчаниюphp://memory. Метод принимает либо объект, который реализует интерфейсStreamInterface, либо строку, такую как имя потока. Режим по умолчанию для потока -w+b. Если пропущен недопустимый поток, генерируется исключение InvalidArgumentExceptioncode- Целое число, представляющее код состояния для ответа. По умолчанию это200.headers- Массив значений ключа, с ключом в качестве имени заголовка и значением в качестве значения заголовка.
Геттеры
getBody()
Возвращает тело как объект StreamInterface. Этот метод полезен также, когда необходимо быстро настроить тело сообщения. Вы можете проверить методы, которые вы можете вызвать, проверив класс Phalcon\Http\Message\Stream.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response($stream);
echo $response->getBody(); // '/assets/stream/mit.txt'
$response->getBody()->write('additional content goes here');
Чтобы получить все содержимое потока:
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response($stream);
$body = $response->getBody();
$body->rewind()
$text = $body->getContents();
getHeader()
Возвращает массив всех значений заголовка переданного без учета регистра имени заголовка. Если строковый параметр, представляющий запрашиваемое имя заголовка, отсутствует, возвращается пустой массив.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => 'application/json',
]
);
echo $response->getHeader('content-Type'); // ['application/json']
echo $response->getHeader('unknown'); // []
getHeaderLine()
Возвращает все значения заголовка данного имени заголовка без учета регистра в виде строки, объединенной вместе с помощью запятой. Если строковый параметр, представляющий запрашиваемое имя заголовка, возвращается пустая строка.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => [
'application/json',
'application/html',
],
]
);
echo $response->getHeaderLine('content-Type'); // 'application/json,application/html'
getHeaders()
Возвращает массив со всеми значениями заголовка сообщения. Ключи представляют имя заголовка, так как оно будет отправлено по проводам, а каждое значение представляет собой массив строк, связанных с заголовком. Хотя имена заголовков не чувствительны к регистру, этот метод сохраняет точный регистр, в котором заголовки были изначально указаны.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => [
'application/json',
'application/html',
],
]
);
var_dump(
$response->getHeaders()
);
// [
// 'Content-Type' => [
// 'application/json',
// 'application/html',
// ],
// ]
getProtocolVersion()
Возвращает версию протокола в виде строки (по умолчанию 1.1)
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => 'application/json',
]
);
echo $response->getProtocolVersion(); // '1.1'
getReasonPhrase()
Возвращает фразу причины ответа, связанную с кодом состояния. Поскольку фраза причины не является обязательным элементом в строке состояния ответа, значение фразы причины может быть пустым. Строка возврата поступает из реестра кодов состояния IANA HTTP, как определено в RFC 7231.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
203,
[
'Content-Type' => 'application/json',
]
);
echo $response->getReasonPhrase(); // 'Non-Authoritative Information'
getStatusCode()
Возвращает код состояния ответа. Код состояния представляет собой трехзначный целочисленный код результата попытки сервера понять и удовлетворить запрос.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
203,
[
'Content-Type' => 'application/json',
]
);
echo $response->getStatusCode(); // 203
getUri()
Возвращает Uri как объект UriInterface
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => 'application/json',
]
);
$response = $response->withUri('https://api.phalcon.io/companies/1');
echo $response->getUri(); // UriInterface : https://api.phalcon.io/companies/1
Существование
hasHeader()
Проверяет, существует ли заголовок с заданным нечувствительным к регистру именем. Возвращает true, если заголовок был найден, false в противном случае
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$response = new Response(
$stream,
200,
[
'Content-Type' => [
'application/json',
'application/html',
],
]
);
echo $response->hasHeader('content-type'); // true
С
Объект запроса является неизменяемым. Однако существует ряд методов, позволяющих вводить в него данные. Возвращаемый объект является клоном исходного объекта.
withAddedHeader()
Возвращает экземпляр с дополнительным заголовком, добавленным к заданному значению. Существующие значения для указанного заголовка будут сохранены. Новое значение(ы) будет добавлено к существующему списку. Если заголовок ранее не существовал, он будет добавлен. Создает исключение InvalidArgumentException для недопустимых имен заголовков или значений. Значения заголовка могут быть строкой или массивом строк.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$jwtToken = 'abc.def.ghi';
$response = new Response(
$stream,
200,
[
'Authorization' => 'Bearer ' . $jwtToken,
'Content-Type' => [
'application/json',
],
]
);
var_dump(
$response->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// 'Content-Type' => [
// 'application/json',
// ],
// ]
$clone = $response->withAddedHeader('Content-Type', ['application/html']);
var_dump(
$clone->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// 'Content-Type' => [
// 'application/json',
// 'application/html',
// ],
// ]
withBody()
Возвращает экземпляр с указанным телом сообщения, который реализует StreamInterface. Создает исключение InvalidArgumentException, когда тело недопустимо.
<?php
use Phalcon\Http\Message\Response;
use Phalcon\Http\Message\Stream;
$fileName = dataFolder('/assets/stream/mit.txt');
$stream = new Stream($fileName, 'rb');
$jwtToken = 'abc.def.ghi';
$response = new Response(
null,
200,
[
'Authorization' => 'Bearer ' . $jwtToken,
'Content-Type' => 'application/json',
]
);
$clone = $response->withBody($stream);
echo $clone->getBody(); // '/assets/stream/mit.txt'
withHeader()
Возвращает экземпляр с предоставленным значением, заменяющим указанный заголовок. В то время как имена заголовков не чувствительны к регистру, оболочка заголовка будет сохранена этой функцией и возвращена из getHeaders(). Создает исключение InvalidArgumentException для недопустимых имен заголовков или значений.
<?php
use Phalcon\Http\Message\Response;
$jwtToken = 'abc.def.ghi';
$response = new Response(
null,
200,
[
'Authorization' => 'Bearer ' . $jwtToken,
]
);
var_dump(
$response->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// ]
$clone = $response->withAddedHeader(
'Content-Type',
[
'application/html',
]
);
var_dump(
$clone->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// 'Content-Type' => [
// 'application/html',
// ],
// ]
withProtocolVersion()
Возвращает экземпляр с указанной версией протокола HTTP (в виде строки).
<?php
use Phalcon\Http\Message\Response;
$response = new Request();
echo $response->getProtocolVersion(); // '1.1'
$clone = $response->withProtocolVersion('2.0');
echo $clone->getProtocolVersion(); // '2.0'
withStatus()
Возвращает экземпляр с указанным кодом состояния и, при необходимости, фразой причины. Если причина не определена, строка причины будет получена из реестра кодов состояния HTTP IANA, как определено в RFC 7231.
<?php use Phalcon\Http\Message\Response; $response = new Request(); echo $response->getStatusCode(); // 200 echo $response->getReasonPhrase(); // OK $clone = $response->withStatus(203, 'Something Else'); echo $response->getStatusCode(); // 203 echo $response->getReasonPhrase(); // 'Something Else'
withUri()
Возвращает экземпляр с предоставленным URI UriInterface . Этот метод обновляет заголовок Host возвращенного запроса по умолчанию, если URI содержит компонент host. Если URI не содержит компонент хоста, любой ранее существующий заголовок хоста будет перенесен в возвращенный запрос.
Вы можете отказаться от сохранения исходного состояния заголовка Host, установив для $preserveHost значение true. Когда $preserveHost имеет значение true, этот метод взаимодействует с заголовком Host следующими способами:
- Если заголовок Host отсутствует или пуст, а новый URI содержит компонент host, этот метод обновит заголовок
Hostв возвращенном запросе. - Если заголовок Host отсутствует или пуст, а новый URI не содержит компонент хоста, этот метод не будет обновлять заголовок
Hostв возвращенном запросе. - Если заголовок Host присутствует и не пуст, этот метод не будет обновлять заголовок
Hostв возвращенном запросе.
<?php use Phalcon\Http\Message\Response; $query = 'https://phalcon.io'; $uri = new Uri($query); $request = new Response(); $clone = $request->withUri($uri); echo $clone->getUri(); // UriInterface: 'https://phalcon.io'
withoutHeader()
Вернуть экземпляр без указанного заголовка.
<?php
use Phalcon\Http\Message\Response;
$jwtToken = 'abc.def.ghi';
$response = new Response(
null,
200,
[
'Authorization' => 'Bearer ' . $jwtToken,
'Content-Type' => [
'application/json',
],
]
);
var_dump(
$response->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// 'Content-Type' => [
// 'application/json',
// ],
// ]
$clone = $response->withoutHeader('Content-Type');
var_dump(
$clone->getHeaders()
);
// [
// 'Authorization' => 'Bearer abc.def.ghi',
// ]