Come pubblicare i Dati JSON Con cURL di PHP?

Ecco il mio codice,

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

E in altra pagina, io sono il recupero di dati post.

    print_r ($_POST);

Uscita è

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 ( ) 

Così, non ricevo dati corretti anche a un mio server, è un array vuoto. Vorrei implementare RESTO utilizzando json al http://docs.shopify.com/api/customer#create

  • Non manca la conversione $data per $data_string utilizzando json_encode()??? Non vedere questa riga di codice…
  • Scusate non ho scritto qui, ma nel mio codice che ho scritto code $data_string=json_encode($dati); code e come scrivere il codice nei commenti?nei commenti non posso scrivere interruzione di riga e così come scrivere il codice?
InformationsquelleAutor user1463076 | 2012-06-18



6 Replies
  1. 169

    L’Invio di json in modo non corretto-ma anche se fosse corretto, sarebbe non essere in grado di test utilizzando print_r($_POST) (leggi perché qui). Al contrario, sulla seconda pagina, è possibile conquistare la richiesta in arrivo utilizzando file_get_contents("php://input"), che conterrà l’Inviato json. Per visualizzare i dati ricevuti in un formato più leggibile, provate questo:

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

    Nel codice, si indica Content-Type:application/json, ma non json-codifica tutti i dati di POST — solo il valore del “cliente” POST di campo. Invece, fare qualcosa di simile a questo:

    $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>";

    Nota a margine: Si potrebbe trarre vantaggio dall’utilizzo di una libreria di terze parti invece di interfacciarsi con il Shopify direttamente con le API di te.

    • grande, funziona come un fascino!
    • Hah! Ho lottato perché non avevo la ricezione di dati tramite $_POST. Il problema è che ho dovuto usare il php://ingresso, come si è detto. Grazie.
    • in modo da non dovete specificare in modo esplicito è richiesta POST? La sua nota perché CURLOPT_POSTFIELDS è impostato?
    • dove era questa risposta quando stavo cercando per tutta la settimana la settimana scorsa? Ora mi trovo dopo ho dovuto capire da solo!
    • Nota: Se si invia JSON e si aspettano JSON come risposta, quindi alcune Api richiedono l’impostazione del tipo di risposta e curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json')); (altrimenti si può inviare JSON, ma ottenere l’XML come risposta).
    • è stato salvato il giorno

  2. 13
    $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);

    Questo codice ha funzionato per me. Si può provare…

  3. 10

    Sostituire

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

    con:

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

    Io non capisco cosa intende per “pagina”, spero che sia la pagina di: ‘url_to_post’. Se la pagina è scritta in PHP, JSON che hai appena postato sopra potrà essere letto nel seguente modo:

    $jsonStr = file_get_contents("php://input"); //read the HTTP body.
    $json = json_decode($jsonStr);
    • Perché si presuppone che? Se lui mette i dati del “cliente” in campo, deve essere così per un motivo, no?
    • Sì, grazie, ho perso quella parte. Ma lui, IMO, è sbagliato. Voglio aggiornare la mia risposta con esso.
    • Nessuna delle soluzioni di cui sopra il lavoro per ottenere i dati json, php, file 🙁
  4. 6

    Si prega di provare questo codice:-

    $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";
  5. 2

    Provare questo esempio.

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

    Tuo page2.php codice

    <?php
    $datastring = $_POST['customer'];
    $data = json_decode( urldecode( $datastring));
    
    ?>
  6. -1

    Provare come questo:

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

    La chiave cosa che hai dimenticato, era per json_encode i tuoi dati. Ma si può anche trovare conveniente utilizzare curl_setopt_array per impostare tutti curl opzioni alla volta passando un array.

    • -1. Controllare le API qui: api.shopify.com/customer.html#create. Il corpo che il server si aspetta in JSON, non urlencoded-json. Controllare la mia risposta, non c’è bisogno di utilizzare array(..) in `CURLOPT_POSTFIELDS
    • Infatti. Quindi i dati che invio è anche sbagliato.
    • Sì, come ho detto, egli è l’invio di sbagliato. Il passaggio di un array(..) per CURLOPT_POSTFIELDS` si urlencode JSON troppo.
    • Comunque, ho provato molte volte con codice diverso, ma non ero in grado di fare in json ora che ho fatto con successo in xml.

Lascia un commento