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]

26voto

Brad Mace Punkte 26337

Setzen Sie den Inhaltstyp mit header('Content-type: application/json'); und dann ein Echo Ihrer Daten.

22voto

Dr. Aaron Dishno Punkte 1699

Es ist auch gut, die Zugriffssicherheit einzustellen - ersetzen Sie einfach * durch die Domäne, die Sie erreichen wollen.

<?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 finden Sie weitere Beispiele dafür: Wie umgeht man Access-Control-Allow-Origin?

0 Stimmen

Was bedeutet es, wenn das nicht funktioniert? Um zum Beispiel nur Aufrufe von CodePen zuzulassen, habe ich versucht header('Access-Control-Allow-Origin: https://cdpn.io'); aber ich kann die Seite immer noch über meinen eigenen Browser laden.

0 Stimmen

Es wird verwendet, um Cross-Scripting zu verhindern (ein Skript ruft eine andere Seite auf). Sie können die Seite also direkt von Ihrem Browser laden, aber nicht von einer anderen Domäne, die ein Skript verwendet.

12voto

Dan Punkte 2598

Eine einfache Funktion zur Rückgabe einer JSON-Antwort mit dem HTTP-Statuscode .

function json_response($data=null, $httpStatus=200)
{
    header_remove();

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

    http_response_code($httpStatus);

    echo json_encode($data);

    exit();
}

1 Stimmen

header_remove und das explizite Setzen der http-Antwort ist eine gute Idee; obwohl das Setzen von status und dann http_response redundant erscheint. Möglicherweise sollten Sie auch eine exit Erklärung bis zum Ende. Ich habe Ihre Funktion mit der von @trincot kombiniert: stackoverflow.com/a/35391449/339440

0 Stimmen

Mit JS FetchAPI, könnten Sie Ihre Antwort auf, wie gesendete Daten zu empfangen erweitern? fetch(...).then(res => res.json()).then(data => /* do smth */).catch(e => console.error(e)) funktioniert hervorragend, wenn die Reaktion 200 aber wie bekommt man $data において 500 um den genauen Fehler anzuzeigen, der in PHP in der .catch() Methode in JS?

0 Stimmen

Um dieses Ziel zu erreichen try { /* code... */ json_response('Success!', 200); } catch (\Exception $e) { json_response($e->getMessage(), 500); }

10voto

Joyal Punkte 2397
<?php
$data = /** whatever you're serializing **/;
header("Content-type: application/json; charset=utf-8");
echo json_encode($data);
?>

1 Stimmen

W

7voto

Tom Ah Punkte 507

Wie oben erwähnt:

header('Content-Type: application/json');

aber bedenken Sie, dass :

  • Ajax wird kein Problem haben, json zu lesen, auch wenn dieser Header nicht verwendet wird, außer wenn Ihr json einige HTML-Tags enthält. In diesem Fall müssen Sie den Header als application/json festlegen.

  • Stellen Sie sicher, dass Ihre Datei nicht in UTF8-BOM kodiert ist. Dieses Format fügt ein Zeichen am Anfang der Datei hinzu, so dass Ihr header()-Aufruf fehlschlagen wird.

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