Ich möchte JSON aus einem PHP-Skript zurückgeben.
Soll ich das Ergebnis einfach wiedergeben? Muss ich die Content-Type
Kopfzeile?
Ich möchte JSON aus einem PHP-Skript zurückgeben.
Soll ich das Ergebnis einfach wiedergeben? Muss ich die Content-Type
Kopfzeile?
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).
Nur für den Fall: Sie sollten header()-Befehle nur in Verbindung mit Ausgabepufferung verwenden, um "Header already sent"-Warnungen zu vermeiden
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.
@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.
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 );
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 .
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).
Versuchen Sie json_encode um die Daten zu kodieren, und setzen Sie den Inhaltstyp mit header('Content-type: application/json');
.
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:
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.
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]