# Класс HttpSoft\Response\JsonResponse

Класс, реализующий Psr\Http\Message\ResponseInterface и HttpSoft\Response\ResponseStatusCodeInterface.

Реализация Psr\Http\Message\ResponseInterface для удобного создания экземпляра из структуры данных для преобразования в JSON.

Если структура данных является объектом, то для корректной сериализации рекомендовано, чтобы объект реализовывал интерфейс JsonSerializable.

Исходный код на GitHub.

use HttpSoft\Response\JsonResponse;

$response = new JsonResponse(['key' => 'value']);
$response->getStatusCode(); // 200
$response->getReasonPhrase(); // 'OK'
$response->getBody()->getContents(); // '{"key":"value"}'
$response->getBody()->getMetadata('uri') // 'php://temp'
$response->getHeaders(); // ['Content-Type' => ['application/json; charset=UTF-8']]
$response->getProtocolVersion(); // '1.1'

$response = new JsonResponse(['key' => 'value'], 404, ['Content-Type' => 'text/plain; charset=UTF-8'], '2');
$response->getStatusCode(); // 404
$response->getReasonPhrase(); // 'Not Found'
$response->getBody()->getContents(); // '{"key":"value"}'
$response->getBody()->getMetadata('uri') // 'php://temp'
$response->getHeaders(); // ['Content-Type' => ['text/plain; charset=UTF-8']]
$response->getProtocolVersion(); // '2'

$newResponse = $response->withHeader('Content-Language', 'ru');
$newResponse->getHeaderLine('content-language'); // 'ru'
$response->getHeaders(); // ['Content-Type' => ['text/plain; charset=UTF-8'], 'Content-Language' => ['ru']]

$newResponse = $response->withStatus(JsonResponse::STATUS_INTERNAL_SERVER_ERROR);
$newResponse->getStatusCode(); // 500
$newResponse->getReasonPhrase(); // 'Internal Server Error'

$newResponse = $response->withStatus(599, 'Custom Phrase');
$newResponse->getStatusCode(); // 599
$newResponse->getReasonPhrase(); // 'Custom Phrase'

С указанием опций кодирования:

use HttpSoft\Response\JsonResponse;

// По умолчанию (JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE):
$response = new JsonResponse('<p>HTML</p>', 200, [], '1.1', '', JsonResponse::DEFAULT_OPTIONS);
$response->getBody()->getContents(); // '"<p>HTML</p>"'
// эквивалентно:
$response = new JsonResponse('<p>HTML</p>');
$response->getBody()->getContents(); // '"<p>HTML</p>"'
// или:
$newResponse = $response->withJsonData('<p>HTML</p>', JsonResponse::DEFAULT_OPTIONS);
$newResponse->getBody()->getContents(); // '"<p>HTML</p>"'
// эквивалентно:
$newResponse = $response->withJsonData('<p>HTML</p>');
$newResponse->getBody()->getContents(); // '"<p>HTML</p>"'

// Для HTML (JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_TAG | JSON_UNESCAPED_UNICODE):
$response = new JsonResponse('<p>HTML</p>', 200, [], '1.1', '', JsonResponse::HTML_OPTIONS);
$response->getBody()->getContents(); // '"\u003Cp\u003EHTML\u003C\/p\u003E"'
// или:
$newResponse = $response->withJsonData('<p>HTML</p>', JsonResponse::HTML_OPTIONS);
$newResponse->getBody()->getContents(); // '"\u003Cp\u003EHTML\u003C\/p\u003E"'

// Пользовательские:
$response = new JsonResponse('<p>HTML</p>', 200, [], '1.1', '', JSON_THROW_ON_ERROR);
$newResponse->getBody()->getContents(); // '"<p>HTML<\/p>"'
// или:
$newResponse = $response->withJsonData('<p>HTML</p>', JSON_THROW_ON_ERROR);
$newResponse->getBody()->getContents(); // '"<p>HTML<\/p>"'

# Публичные методы

Оригинальное подробное описание методов смотрите в Psr\Http\Message\ResponseInterface.

/**
 * @param mixed $data
 * @param int $code
 * @param array $headers
 * @param string $protocol
 * @param string $reasonPhrase
 * @param int $encodingOptions
 * @throws InvalidArgumentException If it is impossible to encode the data in JSON.
 */
public function __construct(
    $data,
    int $code = self::STATUS_OK,
    array $headers = [],
    string $protocol = '1.1',
    string $reasonPhrase = '',
    int $encodingOptions = self::DEFAULT_OPTIONS
);

Если заголовок Content-Type не указан, то по умолчанию ему будет присвоено значение 'application/json; charset=UTF-8'.

Если указана невалидная структура данных, будет брошено исключение \InvalidArgumentException.

# withJsonData

Возвращает новый экземпляр HttpSoft\Response\JsonResponse с преобразованной в JSON указанной структурой данных.

/**
 * @param mixed $data
 * @param int $encodingOptions
 * @return self
 */
public function withJsonData($data, int $encodingOptions = self::DEFAULT_OPTIONS): self;

Если указана невалидная структура данных, будет брошено исключение \InvalidArgumentException.

use HttpSoft\Response\JsonResponse;

$response = new JsonResponse(['key' => 'value']);
$response->getBody()->getContents(); // '{"key":"value"}'

$newResponse = $response->withJsonData('<p>HTML</p>', JsonResponse::DEFAULT_OPTIONS);
$newResponse->getBody()->getContents(); // '"<p>HTML</p>"'
// equivalently to:
$newResponse = $response->withJsonData('<p>HTML</p>');
$newResponse->getBody()->getContents(); // '"<p>HTML</p>"'

$newResponse = $response->withJsonData('<p>HTML</p>', JsonResponse::HTML_OPTIONS);
$newResponse->getBody()->getContents(); // '"\u003Cp\u003EHTML\u003C\/p\u003E"'

$newResponse = $response->withJsonData('<p>HTML</p>', JSON_THROW_ON_ERROR);
$newResponse->getBody()->getContents(); // '"<p>HTML<\/p>"'

// Если указанные данные являются недопустимой последовательностью UTF-8:
$response->withJsonData("\xB1\x31");  // throws InvalidArgumentException
$response->withJsonData("\xB1\x31", JSON_THROW_ON_ERROR);  // throws InvalidArgumentException
// Если указанные данные являются ресурсом:
$response->withJsonData(fopen('php://memory', 'r'));  // throws InvalidArgumentException
$response->withJsonData(fopen('php://memory', 'r'), JSON_THROW_ON_ERROR);  // throws InvalidArgumentException

Все остальные методы с описанием находятся в подключаемых трейтах: