Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.php > #4146 > unrolled thread

mit cURL json-Daten an PHP-Script schicken

Started byRalph Stahl <post@rstahl.de>
First post2017-06-30 09:51 +0200
Last post2017-07-02 16:18 +0200
Articles 5 — 2 participants

Back to article view | Back to de.comp.lang.php


Contents

  mit cURL json-Daten an PHP-Script schicken Ralph Stahl <post@rstahl.de> - 2017-06-30 09:51 +0200
    Re: mit cURL json-Daten an PHP-Script schicken Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2017-06-30 08:58 +0000
      Re: mit cURL json-Daten an PHP-Script schicken Ralph Stahl <post@rstahl.de> - 2017-06-30 13:51 +0200
        Re: mit cURL json-Daten an PHP-Script schicken Stefan+Usenet@Froehlich.Priv.at (Stefan Froehlich) - 2017-06-30 13:42 +0000
          Re: mit cURL json-Daten an PHP-Script schicken Ralph Stahl <post@rstahl.de> - 2017-07-02 16:18 +0200

#4146 — mit cURL json-Daten an PHP-Script schicken

FromRalph Stahl <post@rstahl.de>
Date2017-06-30 09:51 +0200
Subjectmit cURL json-Daten an PHP-Script schicken
Message-ID<oj4vnm$col$1@dont-email.me>
Moin,

Ich konstruiere einen Endpunkt für eine REST-API, die mittels cURL
realisiert werden soll. Damit kann ich das prima in der Shell testen -
wenn es mal funktioniert. Die unwesentliche Randbedingung: Die Sache
läuft mit PHP 7.1 auf einem nginx-Webserver, die API ist mit einem
Redirect zu erreichen (daher der Parameter -L in der curl-Zeile).

Zur Sache:

Die API besteht im Einfachsten Fall aus wenigen Zeilen PHP, die mir den
Inhalt von $_POST und $_GET anzeigen bzw. zurückgeben. Mehr passiert
noch nicht.

<?php
echo 'CMD ' . $_GET['cmd'];
echo "\n";
echo "PARAM\n";
echo print_r($_POST, true);
echo "\n";

Diese steuere ich in der Shell so an:


[rollo: ~] curl -i -d '{"a":5}' -L http://localhost/.../app/getpos
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Fri, 30 Jun 2017 07:38:37 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive

CMD getpos
PARAM
Array
(
)


Das Problem ist also: Meine "Nutzdaten, im Beispiel also der JSON-String
'{"a":5}', kommen so nicht im $_POST an, obwohl die Syntax überall so
beschrieben wird. Lasse ich den Content-Type probehalber weg, kommt

PARAM
Array
(
    [{"a":5}] =>
)

als $_POST-Array an. Die Daten werden also übertrage, allerdings wie zu
erwarten falsch. Es ist übrigens egal, ob ich '{"a":5}' oder "{'a':5}"
schreibe - das wird manchmal als mögliche Fehlerquelle genannt.

Fazit:

Ich bekomme es nicht hin, auswertbare JSON-Daten zu bekommen. Wie
müssten sie eigentlich aussehen? So

Array
(
    "a" => 5
}

vielleicht? Alle möglichen Beispiele, die ich gefunden habe, setzen das
irgendwie voraus :-(.

Bitte helft mir auf die Sprünge, ich drehe mich im Kreis. Danke im Voraus!

Ralph

[toc] | [next] | [standalone]


#4147

FromStefan+Usenet@Froehlich.Priv.at (Stefan Froehlich)
Date2017-06-30 08:58 +0000
Message-ID<3t59560f76i69fn3e8%sfroehli@Froehlich.Priv.at>
In reply to#4146
On Fri, 30 Jun 2017 09:51:52 Ralph Stahl wrote:
> Ich bekomme es nicht hin, auswertbare JSON-Daten zu bekommen. Wie
> müssten sie eigentlich aussehen? So
> 
> Array
> (
>     "a" => 5
> }

Nein, gar nicht. Mit $_POST bekommst Du Daten, die
x-www-form-urlencoded übertragen worden sind, also grob das, was Dir
ein HTML-Formular erzeugt.

JSON sieht ganz anders aus, und da es $_JSON in PHP nicht gibt,
musst Du etwas in der Form von:

#v+
<?php var_dump(json_decode(file_get_contents("php://input"))); ?>
#v-

machen.

Servus,
   Stefan

-- 
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Stefan - die vollkommenste Nuance von neu!
(Sloganizer)

[toc] | [prev] | [next] | [standalone]


#4148

FromRalph Stahl <post@rstahl.de>
Date2017-06-30 13:51 +0200
Message-ID<oj5do3$pd9$1@dont-email.me>
In reply to#4147
Stefan Froehlich schrieb:
> On Fri, 30 Jun 2017 09:51:52 Ralph Stahl wrote:
>> Ich bekomme es nicht hin, auswertbare JSON-Daten zu bekommen. Wie
>> müssten sie eigentlich aussehen? So
>>
>> Array
>> (
>>     "a" => 5
>> }
> 
> Nein, gar nicht. Mit $_POST bekommst Du Daten, die
> x-www-form-urlencoded übertragen worden sind, also grob das, was Dir
> ein HTML-Formular erzeugt.
> 
> JSON sieht ganz anders aus, und da es $_JSON in PHP nicht gibt,
> musst Du etwas in der Form von:
> 
> #v+
> <?php var_dump(json_decode(file_get_contents("php://input"))); ?>
> #v-
> 
> machen.
> 
> Servus,
>    Stefan
> 


Famos! Ich mache jetzt mit deiner obigen Zeile:

<?php
echo 'CMD ' . $_GET['cmd'];
echo "\n";
echo "PARAM\n";
echo var_dump(json_decode(file_get_contents("php://input")));
echo "\n";

und bekomme völlig richtig

[rollo: ~] curl -i -d '{"a":5}' -L http://.../app/getpos
HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Fri, 30 Jun 2017 11:44:36 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive

CMD getpos
PARAM
object(stdClass)#1 (1) {
  ["a"]=>
  int(5)
}

kann also das entstandene Objekt sinnvoll verwenden. Warum wird dann in
allen möglichen Quellen (Foren, Beispielen) einschließlich der Doku zu
curl der Parameter

curl -H "Content-Type: text/json" ...

als erforderlich bezeichnet?

Danke Stefan!

Ralph

[toc] | [prev] | [next] | [standalone]


#4149

FromStefan+Usenet@Froehlich.Priv.at (Stefan Froehlich)
Date2017-06-30 13:42 +0000
Message-ID<5t5956542bi6adcn3e8%sfroehli@Froehlich.Priv.at>
In reply to#4148
On Fri, 30 Jun 2017 13:51:01 Ralph Stahl wrote:
> Stefan Froehlich schrieb:
> > JSON sieht ganz anders aus, und da es $_JSON in PHP nicht gibt,
> > musst Du etwas in der Form von:
> > 
> > #v+
> > <?php var_dump(json_decode(file_get_contents("php://input"))); ?>
> > #v-
> > 
> > machen.
 
> [...] Warum wird dann in allen möglichen Quellen (Foren, Beispielen)
> einschließlich der Doku zu curl der Parameter
> 
> curl -H "Content-Type: text/json" ...
> 
> als erforderlich bezeichnet?

Weil's korrekt ist: Du schickst ja nun einmal nicht HTML sondern JSON
über die Leitung.

Das ist zwar egal, wenn am anderen Ende jemand php://input verwendet,
aber es *könnte* dort auch abhängig vom Content-Type verarbeitet werden.

Servus,
   Stefan

-- 
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Vergnügen mit Stefan, überlegen und fern!
(Sloganizer)

[toc] | [prev] | [next] | [standalone]


#4153

FromRalph Stahl <post@rstahl.de>
Date2017-07-02 16:18 +0200
Message-ID<ojav41$fl$1@dont-email.me>
In reply to#4149
Stefan Froehlich schrieb:
> On Fri, 30 Jun 2017 13:51:01 Ralph Stahl wrote:
>> Stefan Froehlich schrieb:
>>> JSON sieht ganz anders aus, und da es $_JSON in PHP nicht gibt,
>>> musst Du etwas in der Form von:
>>>
>>> #v+
>>> <?php var_dump(json_decode(file_get_contents("php://input"))); ?>
>>> #v-
>>>
>>> machen.
>  
>> [...] Warum wird dann in allen möglichen Quellen (Foren, Beispielen)
>> einschließlich der Doku zu curl der Parameter
>>
>> curl -H "Content-Type: text/json" ...
>>
>> als erforderlich bezeichnet?
> 
> Weil's korrekt ist: Du schickst ja nun einmal nicht HTML sondern JSON
> über die Leitung.
> 
> Das ist zwar egal, wenn am anderen Ende jemand php://input verwendet,
> aber es *könnte* dort auch abhängig vom Content-Type verarbeitet werden.
> 
> Servus,
>    Stefan
> 

Danke Stefan! Alles verstanden :-).

Ralph

[toc] | [prev] | [standalone]


Back to top | Article view | de.comp.lang.php


csiph-web