Я хочу вернуть JSON из скрипта PHP. Надо ли устанавливать Content-Type заголовок?
Ответ 1
Хотя обычно все работает и без этого, но, согласно спецификации, вам обязательно необходимо устанавливать Content-Type заголовок:
<?php
$data = /** все, что вы сериализуете **/;
header('Content-Type: application/json');
echo json_encode($data);
Если я не использую конкретный фреймворк, я обычно разрешаю некоторым параметрам запроса изменять поведение вывода. Как правило, для быстрого устранения неполадок может быть полезно не отправлять заголовок, а использовать print_r и другую полезную нагрузку данных (хотя в большинстве случаев в этом нет необходимости).
Ответ 2
Полный фрагмент допустимого и понятного PHP-кода, возвращающего JSON, выглядит так:
$option = $_GET['option'];
if ( $option == 1 ) {
$data = [ 'a', 'b', 'c' ];
// декодируем в JSON массив: ["a","b","c"]
} else {
$data = [ 'name' => 'God', 'age' => -1 ];
// декодируем в JSON объект: {"name":"God","age":-1}
}
header('Content-type: application/json');
echo json_encode( $data );
Ответ 3
Согласно руководству по методу json_encode, он может возвращать нестроковый ответ (false): Возвращает строку в кодировке JSON в случае успеха или FALSE, если ошибка.
Когда это произойдет, echo json_encode($data) будет выведена пустая строка, которая является недопустимым JSON.
json_encode, например, завершится с ошибкой (и вернет false), если его аргумент содержит строку, отличную от UTF-8.
Это состояние ошибки должно быть зафиксировано в PHP, например, следующим образом:
<?php
header("Content-Type: application/json");
// Соберите все необходимое в переменную $data.
$json = json_encode($data);
if ($json === false) {
// Избегайте эха пустой строки (которая является недействительным JSON)
$json = json_encode(["jsonError" => json_last_error_msg()]);
if ($json === false) {
// Этого не должно быть, но мы идем до конца:
$json = '{"jsonError":"unknown"}';
}
// Установка кода статуса ответа HTTP: 500 - Внутренняя ошибка сервера http_response_code(500);
}
echo $json;
?>
Тогда принимающая сторона, конечно же, должна знать, что наличие свойства jsonError указывает на состояние ошибки, которое она должна обрабатывать соответствующим образом.
В производственном режиме может быть лучше отправлять клиенту только общий статус ошибки и регистрировать более конкретные сообщения об ошибках для дальнейшего исследования.
Дополнительные сведения о работе с ошибками JSON см. в документации PHP.
Ответ 3
Также хорошо установить безопасность доступа — просто замените «*» на домен, к которому вы хотите получить доступ.
<?php
header('Access-Control-Allow-Origin: *');
header('Content-type: application/json');
$response = array();
$response[0] = array(
'id' => '1',
'value1'=> 'value1',
'value2'=> 'value2'
);
echo json_encode($response);
?>
Ответ 4
На этот вопрос было много ответов, но ни один из них не охватывает весь процесс возврата чистого JSON со всем необходимым для предотвращения искажения ответа JSON.
function returnJsonHttpResponse($success, $data) {
// удалите любую строку, которая может создать недопустимый JSON
// такие как PHP Notice, Warning, logs...
ob_clean();
// это очистит все ранее добавленные заголовки, чтобы начать с чистого листа
header_remove();
// Установите тип содержимого JSON и charset
// (charset может быть установлен на что-то другое)
header("Content-type: application/json; charset=utf-8");
// Установите код ответа HTTP, 2xx = SUCCESS,
// любой другой будет ошибкой, обратитесь к документации HTTP
if ($success) {
http_response_code(200);
} else {
http_response_code(500);
}
// кодируйте ваш объект или массив PHP в строку JSON.
// stdClass или массив
echo json_encode($data);
exit();
}
Ответ 5
Простая функция для возврата ответа JSON с кодом состояния HTTP .
function json_response($data=null, $httpStatus=200) {
header_remove();
header("Content-Type: application/json");
http_response_code($httpStatus);
echo json_encode($data);
exit();
}
Web