Wie poste ich JSON-Daten mit PHP cURL?

132

Hier ist mein Code,

$url = 'url_to_post';
$data = array(
    "first_name" => "First name",
    "last_name" => "last name",
    "email"=>"[email protected]",
    "addresses" => array (
        "address1" => "some address",
        "city" => "city",
        "country" => "CA",
        "first_name" =>  "Mother",
        "last_name" =>  "Lastnameson",
        "phone" => "555-1212",
        "province" => "ON",
        "zip" => "123 ABC"
    )
);
$data_string = json_encode($data);
$ch=curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER,
    array(
        'Content-Type:application/json',
        'Content-Length: ' . strlen($data_string)
    )
);

$result = curl_exec($ch);
curl_close($ch);

Und auf einer anderen Seite rufe ich Postdaten ab.

    print_r ($_POST);

Ausgabe ist

HTTP/1.1 200 OK
Date: Mon, 18 Jun 2012 07:58:11 GMT
Server: Apache
X-Powered-By: PHP/5.3.6
Vary: Accept-Encoding
Connection: close
Content-Type: text/html

Array ( ) 

Ich erhalte also nicht einmal auf meinem eigenen Server die richtigen Daten, es ist ein leeres Array. Ich möchte REST mit json unter http://docs.shopify.com/api/customer#create implementieren

user1463076
quelle
2
Fehlt Ihnen nicht die Umstellung $dataauf " $data_stringVerwendung" json_encode()? Sehen Sie diese Codezeile nicht ...
Shadyyx
Entschuldigung, ich habe hier nicht geschrieben, aber in meinen Code habe ich code$ data_string = json_encode ($ data) geschrieben; codeund wie schreibe ich Code in Kommentare? in Kommentaren kann ich keinen Zeilenumbruch schreiben und wie schreibe ich Code?
user1463076

Antworten:

190

Sie veröffentlichen den JSON falsch - aber selbst wenn er korrekt wäre, könnten Sie ihn nicht testen print_r($_POST)( lesen Sie hier, warum ). Stattdessen können Sie auf Ihrer zweiten Seite die eingehende Anforderung mit file_get_contents("php://input")abrufen, die den POST-JSON enthält . Versuchen Sie Folgendes, um die empfangenen Daten in einem besser lesbaren Format anzuzeigen:

echo '<pre>'.print_r(json_decode(file_get_contents("php://input")),1).'</pre>';

In Ihrem Code geben Sie an Content-Type:application/json, aber Sie codieren nicht alle POST-Daten per JSON - nur den Wert des POST-Felds "Kunde". Machen Sie stattdessen so etwas:

$ch = curl_init( $url );
# Setup request to send json via POST.
$payload = json_encode( array( "customer"=> $data ) );
curl_setopt( $ch, CURLOPT_POSTFIELDS, $payload );
curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));
# Return response instead of printing.
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
# Send request.
$result = curl_exec($ch);
curl_close($ch);
# Print response.
echo "<pre>$result</pre>";

Nebenbemerkung: Sie können von der Verwendung einer Bibliothek eines Drittanbieters profitieren, anstatt selbst direkt mit der Shopify-API zu kommunizieren.

Stephen M. Harris
quelle
1
Hah! Ich hatte Probleme, warum ich die Daten nicht über $ _POST erhielt. Das Problem war, dass ich php: // input verwenden musste, wie Sie sagten. Vielen Dank.
YOMorales
Sie müssen also nicht explizit angeben, dass es sich um eine POST-Anforderung handelt? Es ist bekannt, weil CURLOPT_POSTFIELDS gesetzt ist?
Srneczek
Wo war diese Antwort, als ich letzte Woche die ganze Woche danach gesucht habe? Jetzt finde ich es weit, nachdem ich es selbst herausfinden musste!
Python29033
Nebenbemerkung: Wenn Sie JSON senden und JSON als Antwort erwarten, müssen für einige APIs auch der Antworttyp festgelegt werden curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(andernfalls können Sie JSON senden, aber XML als Antwort erhalten).
Pixelbrackets
2
Sie haben den Tag gerettet
Nisal Edu
29
$url = 'url_to_post';
$data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );

$postdata = json_encode($data);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
$result = curl_exec($ch);
curl_close($ch);
print_r ($result);

Dieser Code hat bei mir funktioniert. Du kannst es versuchen...

Stern Roki
quelle
13

Ersetzen

curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));

mit:

$data_string = json_encode(array("customer"=>$data));
//Send blindly the json-encoded string.
//The server, IMO, expects the body of the HTTP request to be in JSON
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

Ich verstehe nicht, was Sie mit "andere Seite" gemeint haben, ich hoffe, es ist die Seite unter: 'url_to_post'. Wenn diese Seite in PHP geschrieben ist, wird der oben veröffentlichte JSON folgendermaßen gelesen:

$jsonStr = file_get_contents("php://input"); //read the HTTP body.
$json = json_decode($jsonStr);
UltraInstinct
quelle
Warum würden Sie das annehmen? Wenn er die Daten in das Feld "Kunde" einfügt, muss er dies aus einem Grund tun, nicht wahr?
Okonomiyaki3000
Ja, danke, ich habe diesen Teil verpasst. Aber er, IMO, macht es falsch. Ich werde meine Antwort damit aktualisieren.
UltraInstinct
Keine der oben genannten Lösungen funktioniert, um JSON-Daten in PHP-Datei zu erhalten :(
Gohel Kiran
7

Bitte versuchen Sie diesen Code: -

$url = 'url_to_post';

$data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );

$data_string = json_encode(array("customer" =>$data));

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

echo "$result";
Damini Mahawer
quelle
3

Versuchen Sie dieses Beispiel.

<?php 
 $url = 'http://localhost/test/page2.php';
    $data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );
    $ch=curl_init($url);
    $data_string = urlencode(json_encode($data));
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($ch, CURLOPT_POSTFIELDS, array("customer"=>$data_string));


    $result = curl_exec($ch);
    curl_close($ch);

    echo $result;
?>

Ihr page2.php-Code

<?php
$datastring = $_POST['customer'];
$data = json_decode( urldecode( $datastring));

?>
Prasad Rajapaksha
quelle
1

Versuchen Sie es so:

$url = 'url_to_post';
// this is only part of the data you need to sen
$customer_data = array("first_name" => "First name","last_name" => "last name","email"=>"[email protected]","addresses" => array ("address1" => "some address" ,"city" => "city","country" => "CA", "first_name" =>  "Mother","last_name" =>  "Lastnameson","phone" => "555-1212", "province" => "ON", "zip" => "123 ABC" ) );
// As per your API, the customer data should be structured this way
$data = array("customer" => $customer_data);
// And then encoded as a json string
$data_string = json_encode($data);
$ch=curl_init($url);

curl_setopt_array($ch, array(
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data_string,
    CURLOPT_HEADER => true,
    CURLOPT_HTTPHEADER => array('Content-Type:application/json', 'Content-Length: ' . strlen($data_string)))
));

$result = curl_exec($ch);
curl_close($ch);

Der Schlüssel, den Sie vergessen haben, war, Ihre Daten mit json_encode zu versehen. Es kann jedoch auch zweckmäßig sein, curl_setopt_array zu verwenden, um alle Curl-Optionen gleichzeitig festzulegen, indem ein Array übergeben wird.

Okonomiyaki3000
quelle
-1. Überprüfen Sie die API hier: api.shopify.com/customer.html#create . Der Körper, den der Server in JSON erwartet, nicht urlencoded-json. Überprüfen Sie meine Antwort, keine Notwendigkeit, array(..)in `CURLOPT_POSTFIELDS
UltraInstinct
Ja, wie gesagt, er schickt es falsch. Wenn Sie ein array(..)an CURLOPT_POSTFIELDS übergeben, wird auch der JSON urlencodiert.
UltraInstinct
Wie auch immer, ich habe es viele Male mit anderem Code versucht, aber ich konnte es nicht in json tun, jetzt habe ich es erfolgreich in XML gemacht.
user1463076