Rückgabe von JSON aus einem PHP-Skript

Lesezeit: 5 Minuten

Ruckgabe von JSON aus einem PHP Skript
Scott Nicol

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

Wiederhole ich nur das Ergebnis? Muss ich die einstellen Content-Type Header?

Ruckgabe von JSON aus einem PHP Skript
timdev

Während Sie normalerweise ohne es auskommen, können und sollten Sie das einstellen Content-Type Header:

<?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 normalerweise einigen Anforderungsparametern, das Ausgabeverhalten zu ändern. Es kann nützlich sein, im Allgemeinen für eine schnelle Fehlerbehebung, einen Header nicht zu senden, oder manchmal print_r die Datennutzlast, um sie zu prüfen (obwohl dies in den meisten Fällen nicht erforderlich sein sollte).

  • für alle Fälle: Sie sollten header()-Befehle nur zusätzlich mit Ausgabepufferung verwenden, um “Header bereits gesendet”-Warnungen zu vermeiden

    – Kevin

    2. Juli 2014 um 16:51 Uhr

  • Es hat sich bewährt, Ihre header()-Anweisungen immer so weit oben auf der Seite wie möglich zu platzieren, damit Sie beim Hinzufügen von mehr Code nicht in Versuchung geraten, Code vor der header()-Anweisung einzufügen, was zu Problemen führen könnte, wenn Sie anfangen ausgeben.

    – Mikepote

    13. Oktober 2014 um 13:17 Uhr

  • @mikepote Ich glaube eigentlich nicht, dass es notwendig ist, den Header-Befehl oben in der PHP-Datei zu haben. Wenn Sie versehentlich etwas ausspucken und das Ihren Header-Befehl zum Stolpern bringt, müssen Sie nur Ihren Code reparieren, weil er kaputt ist.

    – Halbstopp

    10. September 2015 um 18:02 Uhr

  • @KrzysztofKalinowski nein, die PHP-Datei muss nicht UTF-8-codiert sein. die Ausgabe MUSS UTF-8 kodiert sein. Diese falschen Aussagen helfen unerfahrenen Benutzern nicht dabei, zu lernen, wie man verhindert, dass Dinge kaputt gehen, aber es hilft, Mythen über sie zu verbreiten und nie zu lernen, welche Rolle Kodierungen in Streams spielen und wie sie funktionieren.

    – Axel Costas Pena

    26. Oktober 2016 um 11:58 Uhr

  • @timdev Anruf nicht vergessen exit(); von die(); gleich nach echo json_encode($data);andernfalls könnten zufällige Daten aus Ihrem Skript (z. B. Profilerstellung) an Ihre JSON-Antwort angehängt werden.

    – Binäres Web

    16. Juni 2018 um 8:59 Uhr

Ruckgabe von JSON aus einem PHP Skript
aesede

Ein vollständiges Stück netter 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 );

  • Sie sollten wahrscheinlich Folgendes tun: $option = isset($_GET['option']); vorweg.

    – Fulvo

    11. Oktober 2021 um 5:34 Uhr

Ruckgabe von JSON aus einem PHP Skript
Trinkot

Entsprechend der Handbuch an json_encode Die Methode kann einen Nicht-String (falsch):

Gibt bei Erfolg eine JSON-codierte Zeichenfolge zurück oder FALSE auf Versagen.

Wenn das passiert echo json_encode($data) gibt die leere Zeichenfolge aus, die ungültiges JSON ist.

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

Diese Fehlerbedingung sollte in PHP erfasst werden, zum Beispiel so:

<?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 der Gegenseite natürlich bewusst sein, dass das Vorhandensein der jsonFehler -Eigenschaft zeigt eine Fehlerbedingung an, die entsprechend behandelt werden sollte.

Im Produktionsmodus ist es möglicherweise besser, nur einen allgemeinen Fehlerstatus an den Client zu senden und die spezifischeren Fehlermeldungen zur späteren Untersuchung zu protokollieren.

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

  • Da ist kein charset Parameter für JSON; siehe Hinweis am Ende tools.ietf.org/html/rfc8259#section-11: “Für diese Registrierung ist kein ‘charset’-Parameter definiert. Das Hinzufügen eines Parameters hat wirklich keine Auswirkung auf konforme Empfänger.” (JSON muss als UTF-8 per übertragen werden tools.ietf.org/html/rfc8259#section-8.1daher ist die Angabe, dass es als UTF-8 codiert ist, etwas überflüssig.)

    – Patrick Dunkel

    10. Februar 2018 um 6:26 Uhr

  • Danke, dass du das hervorgehoben hast, @PatrickDark. Überflüssig charset Parameter aus HTTP-Header-String entfernt.

    – Trinkot

    10. Februar 2018 um 7:53 Uhr

1647073450 888 Ruckgabe von JSON aus einem PHP Skript
diejh

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

Stellen Sie den Inhaltstyp mit ein header('Content-type: application/json'); und geben Sie dann Ihre Daten wieder.

Auf diese Frage gab es viele Antworten, aber keine deckte den gesamten Prozess ab, um sauberes JSON mit allem zurückzugeben, was erforderlich ist, um zu verhindern, dass die JSON-Antwort fehlerhaft formatiert wird.


/*
 * 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();
}

Verweise:

Antwort_entfernen

ob_sauber

Inhaltstyp JSON

HTTP-Codes

http_response_code

json_encode

Es ist auch gut, die Zugriffssicherheit einzustellen – ersetzen Sie einfach * durch die Domain, die Sie erreichen möchten.

<?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); 
?>

Hier sind weitere Beispiele dazu: Wie kann Access-Control-Allow-Origin umgangen werden?

  • Was bedeutet es, wenn dies nicht funktioniert? Zum Beispiel, um nur Anrufe von CodePen zu beschränken, habe ich versucht header('Access-Control-Allow-Origin: https://cdpn.io');aber ich kann die Seite trotzdem von meinem eigenen Browser aus laden.

    – Ashleedawg

    2. Juli 2020 um 13:56 Uhr

  • Es wird zum Blockieren von Cross-Scripting (ein Skript, das eine andere Seite aufruft) verwendet. Sie können es also direkt von Ihrem Browser laden, aber Sie können es nicht mit Skript von einer anderen Domain laden.

    – Dr. Aaron Dishno

    8. Juli 2020 um 18:46 Uhr

993140cookie-checkRückgabe von JSON aus einem PHP-Skript

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy