1132 Stimmen

Rückgabe von JSON aus einem PHP-Skript

Ich möchte JSON aus einem PHP-Skript zurückgeben.

Soll ich das Ergebnis einfach wiedergeben? Muss ich die Content-Type Kopfzeile?

3 Stimmen

Setzen Sie immer den Content-Type-Header für json, um XSS zu vermeiden. Beachten Sie den Unterschied zwischen diesen beiden Skripten: <?php print json_encode(["someKey" => "<body onload=alert(1)>"]); ?> und <?php header("Content-Type: application/json");print json_encode(["someKey" => "<body onload=alert(1)>"]); ?> Für weitere Informationen siehe: security.stackexchange.com/questions/169427/ [Kann keine Antwort einreichen, da Rufvoraussetzung]

2032voto

timdev Punkte 59971

Normalerweise geht es auch ohne, aber Sie können und sollten die Content-Type Kopfzeile:

<?php
$data = /** whatever you're serializing **/;
header('Content-Type: application/json; charset=utf-8');
echo json_encode($data);

Wenn ich kein bestimmtes Framework verwende, erlaube ich in der Regel einige Anforderungsparameter, um das Ausgabeverhalten zu ändern. Es kann nützlich sein, im Allgemeinen für eine schnelle Fehlersuche, keinen Header zu senden, oder manchmal print_r die Nutzdaten, um sie zu überprüfen (obwohl dies in den meisten Fällen nicht notwendig sein sollte).

13 Stimmen

Nur für den Fall: Sie sollten header()-Befehle nur in Verbindung mit Ausgabepufferung verwenden, um "Header already sent"-Warnungen zu vermeiden

1 Stimmen

Es ist eine gute Praxis, die header()-Anweisungen immer so weit oben auf der Seite wie möglich zu platzieren, damit Sie beim Hinzufügen von weiterem Code nicht in Versuchung kommen, Code vor der header()-Anweisung einzufügen, der die Sache kaputt machen könnte, wenn Sie mit der Ausgabe beginnen.

25 Stimmen

@mikepote Ich glaube nicht, dass es notwendig ist, den Header-Befehl am Anfang der PHP-Datei zu haben. Wenn Sie versehentlich Zeug ausspucken und das Ihren Header-Befehl stört, müssen Sie einfach Ihren Code korrigieren, weil er fehlerhaft ist.

154voto

aesede Punkte 5313

Ein komplettes Stück schöner und klarer PHP-Code, der JSON zurückgibt, ist:

$option = $_GET['option'];

if ( $option == 1 ) {
    $data = [ 'a', 'b', 'c' ];
    // will encode to JSON array: ["a","b","c"]
    // accessed as example in JavaScript like: result[1] (returns "b")
} else {
    $data = [ 'name' => 'God', 'age' => -1 ];
    // will encode to JSON object: {"name":"God","age":-1}  
    // accessed as example in JavaScript like: result.name or result['name'] (returns "God")
}

header('Content-type: application/json');
echo json_encode( $data );

1 Stimmen

Das sollten Sie wahrscheinlich tun: $option = isset($_GET['option']); im Vorfeld.

0 Stimmen

$option = isset($_GET['option']) ? trim($_GET['option']) : null;

66voto

trincot Punkte 257127

Nach Angaben der Handbuch über json_encode kann die Methode einen Nicht-String zurückgeben ( falsch ) :

Gibt bei Erfolg eine JSON-kodierte Zeichenkette zurück oder FALSE bei Misserfolg.

Wenn dies geschieht echo json_encode($data) gibt die leere Zeichenkette aus, d. h. ungültiges JSON .

json_encode wird zum Beispiel fehlschlagen (und Folgendes zurückgeben false ), wenn sein Argument eine Nicht-UTF-8-Zeichenkette enthält.

Diese Fehlerbedingung sollte in PHP erfasst werden, z. B. wie folgt:

<?php
header("Content-Type: application/json");

// Collect what you need in the $data variable.

$json = json_encode($data);
if ($json === false) {
    // Avoid echo of empty string (which is invalid JSON), and
    // JSONify the error message instead:
    $json = json_encode(["jsonError" => json_last_error_msg()]);
    if ($json === false) {
        // This should not happen, but we go all the way now:
        $json = '{"jsonError":"unknown"}';
    }
    // Set HTTP response status code to: 500 - Internal Server Error
    http_response_code(500);
}
echo $json;
?>

Dann sollte die Gegenstelle natürlich wissen, dass die Anwesenheit des jsonError Eigenschaft weist auf einen Fehlerzustand hin, der entsprechend behandelt werden sollte.

Im Produktionsbetrieb ist es möglicherweise besser, nur einen allgemeinen Fehlerstatus an den Client zu senden und die spezifischeren Fehlermeldungen für spätere Untersuchungen zu protokollieren.

Lesen Sie mehr über den Umgang mit JSON-Fehlern in Die PHP-Dokumentation .

3 Stimmen

Es gibt keine charset Parameter für JSON; siehe den Hinweis am Ende von tools.ietf.org/html/rfc8259#section-11 : "Für diese Registrierung ist kein 'charset'-Parameter definiert. Das Hinzufügen eines solchen Parameters hat keine Auswirkungen auf konforme Empfänger." (JSON muss als UTF-8 übertragen werden gemäß tools.ietf.org/html/rfc8259#section-8.1 Die Angabe, dass es als UTF-8 kodiert ist, ist also ein wenig überflüssig).

1 Stimmen

Danke für diesen Hinweis, @PatrickDark. Redundant charset aus dem HTTP-Header-String entfernt.

41voto

thejh Punkte 43512

Versuchen Sie json_encode um die Daten zu kodieren, und setzen Sie den Inhaltstyp mit header('Content-type: application/json'); .

36voto

sonique Punkte 4072

Auf diese Frage gab es viele Antworten, aber keine deckte den gesamten Prozess zur Rückgabe von sauberem JSON mit allem, was erforderlich ist, um zu verhindern, dass die JSON-Antwort missgebildet ist.

/*
 * returnJsonHttpResponse
 * @param $success: Boolean
 * @param $data: Object or Array
 */
function returnJsonHttpResponse($success, $data)
{
    // remove any string that could create an invalid JSON 
    // such as PHP Notice, Warning, logs...
    ob_clean();

    // this will clean up any previously added headers, to start clean
    header_remove(); 

    // Set the content type to JSON and charset 
    // (charset can be set to something else)
    header("Content-type: application/json; charset=utf-8");

    // Set your HTTP response code, 2xx = SUCCESS, 
    // anything else will be error, refer to HTTP documentation
    if ($success) {
        http_response_code(200);
    } else {
        http_response_code(500);
    }

    // encode your PHP Object or Array into a JSON string.
    // stdClass or array
    echo json_encode($data);

    // making sure nothing is added
    exit();
}

Referenzen:

Antwort_entfernen

ob_clean

Inhaltstyp JSON

HTTP-Codes

http_Antwort_code

json_encode

2 Stimmen

Vielen Dank für den Hinweis auf ob_clean. Ich hatte eine führende Zeile, die meine fetch response.json()-Aufrufe angehoben wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X