Web

Возврат JSON из PHP-скрипта

Я хочу вернуть 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

Проверка равенства двух массивов в PHP

Web

Отношения Laravel: попытка получить "описание" свойства не-объекта

Web

Выполнение фонового процесса в PHP

Web

Сортировка многомерного массива по нескольким столбцам

×