Meister C.: Javascript, PHP ...und JSON

Hallo,

Ich versuche, JSON-Data auf den Server zu jagen, was mir sehr erfolgreich misslingt.

In meinem LocalStorage habe ich folgenden Eintrag:

testData: {"user":"user","id":1,"timestamp":2147483647}

Per fetch will ich das meinem Server aufzwingen und zwar

const jsonData = localStorage.getItem("testData");
		
		const options = {
			method: "POST",
			body: jsonData
		};
		const response = fetch("./fetch_php.php", options)
		.then(res => {
				return res.text();
		})
		.then(text => {
			console.log("Zurückgegebener Text: ", text);
		});

(ja ich weiß, catch hab ich jetzt mal aussen vorgelassen, so schon kompliziert genug)

In fetch_php.php versuche ich, $_POST zurückzuschießen var_dump($_POST);, das Resultat ist

Zurückgegebener Text:  array(0) {
}

Wo ist mein Eintrag hin?

Danke, Meister C.

  1. Hallo Meister,

    zwei Dinge:

    • setz einen Header mit ContentType: application/json
    • setz nicht das Objekt in den Body, sondern JSON.stringfy(jsonData)

    Das müsste dann reichen.

    Unser Wiki ist noch nicht so fetchy, ich verweise mal auf Mozilla

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hallo,

      Danke für die Antwort.

      Problem dürfte doch PHP-seitig liegen...

      (...NACHDEM ich res.text() gegen res.json() getauscht habe...)

      header('Content-Type: application/json');
      $user_data = json_decode($_POST);
      echo($user_data["user"]);
      

      resultiert in

      Error: SyntaxError: Unexpected token < in JSON at position 0

      1. +++ UPDATE +++

        Okay, der Weg aus dem Verderben riecht [anscheinend] nach:

        header('Content-Type: application/json');
        $json = file_get_contents('php://input');
        $user_data = json_decode($json);
        var_dump($user_data);
        /* ODER */
        echo $user_data->user;
        

        ...wobei der header hier keinen Unterschied zu machen scheint...

        ... was mir wiederum eher außer(wenn nicht sogar UNTERirdisch) erscheint, da im Falle der echo Ausgabe dann ja ein falscher Header mitgeliefert wird; - im Fall von echo $user_data->user; wird ja einfach ein String und kein JSON Objekt übergeben. Das schert den Browser aber anscheinend wenig, da die echo Ausgabe mit und ohne [falschem] Header funktioniert.

        [Wofür] brauche ich die header Spezifikation hier überhaupt?

        UND - ist der obige Code in Ordnung?

        1. ...und ERST RECHT wieder zu fragen vergessen...

          P.S.: Komme ich an die JSON Information tatsächlich nur über file_get_contents('php://input'); - oder auch über $_POST[] heran?

          1. Hallo Meister,

            der Header ist im PHP nur für die Ausgabe an den Client wichtig und nicht für die Interpretation der Eingabedaten. Du musst diesen Header im Client setzen, für den fetch. Hier ist ein Beispiel (das umfangreicher ist als das, was Du brauchst).

            Und du solltest den Header auch im PHP abfragen, also mit $_SERVER['HTTP_CONTENT_TYPE'] == 'application/json'.

            Das Verarbeiten des POST Body mit php://input ist korrekt.

            Rolf

            --
            sumpsi - posui - obstruxi
            1. Hallo Rolf,

              danke für die rasche Antwort!

              Habe selbst noch ein bisschen weiter recherchiert und bin jetzt ein wenig verunsichert. Im offiziellen Manual von php.net wird 'HTTP_CONTENT_TYPE' für $_SERVER[] gar nicht angeführt, sondern lediglich als Randnotiz von User krinklemail erwähnt. Auch über 'CONTENT_TYPE' bin ich immer wieder gestolpert. Am nächsten scheint mir noch 'HTTP_ACCEPT' zu kommen, was aber nicht ganz das gleiche wie 'HTTP_CONTENT_TYPE' zu sein scheint.

              Kann es sein, dass 'HTTP_CONTENT_TYPE' irgendwie als deprecated gilt - oder ist die offizielle Dokumentation tatsächlich so lückenhaft?

              Danke!

              1. Hallo,

                Kann es sein, dass 'HTTP_CONTENT_TYPE' irgendwie als deprecated gilt - oder ist die offizielle Dokumentation tatsächlich so lückenhaft?

                ich will Rolf da nicht in die Parade fahren, aber ich vermute, dass er da etwas verwechselt hat. Ich meine mich nämlich zu erinnern, dass $HTTP_CONTENT_TYPE ganz, ganz früher mal ein Alias für $_SERVER['Content-Type'] war, aber schon lange als depecated gilt.

                Einen schönen Tag noch
                 Martin

                --
                Was ist der schnellste Weg von einem Suchtreffer zum nächsten?
                Ein Googlehupf.
                1. Hallo Martin,

                  mein Windows ist am Ar... und mein IIS startet nicht. Die Windows Reparaturdienste starten auch nicht (das Neuaufsetzen mach ich dann auf neuer Hardware, wenn sie da ist). Drum kann ich es nicht mehr probieren.

                  Und mein Know How scheint sub par zu sein; ich weiß jetzt auch gar nicht mehr, wie ich auf die Idee mit HTTP_CONTENT_TYPE gekommen bin.

                  Rolf

                  --
                  sumpsi - posui - obstruxi
                  1. n'Abend,

                    mein Windows ist am Ar... und mein IIS startet nicht.

                    ja, ein Königeich für ein Betriebssystem! Sowas kenne ich zumindest auf eigener Scholle seit über 10 Jahren nicht mehr. Dafür auf dem Windows-10-Notebook meines Arbeitgebers (ist etwa 2 Jahre her):

                    Problembehandlungs-Assistent

                    Geil: Die Problembehandlung kann aufgrund eines Problems nicht getartet werden.

                    Und mein Know How scheint sub par zu sein; ich weiß jetzt auch gar nicht mehr, wie ich auf die Idee mit HTTP_CONTENT_TYPE gekommen bin.

                    Vermutlich irgendeine Erinnerung ganz tief aus dem Langzeitgedächtnis.

                    Einen schönen Tag noch
                     Martin

                    --
                    Was ist der schnellste Weg von einem Suchtreffer zum nächsten?
                    Ein Googlehupf.
                    1. Hi,

                      Geil: Die Problembehandlung kann aufgrund eines Problems nicht gestartet werden.

                      Wollen Sie den Vorgang abbrechen?
                      [ OK ] [ Abbrechen ]

                      cu,
                      Andreas a/k/a MudGuard