Comment publier des données JSON avec PHP cURL?

132

Voici mon 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);

Et sur une autre page, je récupère les données de publication.

    print_r ($_POST);

La sortie est

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

Donc, je n'obtiens pas les données appropriées même sur mon propre serveur, c'est un tableau vide. Je souhaite implémenter REST en utilisant json comme à http://docs.shopify.com/api/customer#create

user1463076
la source
2
Vous ne manquez pas de convertir $dataen $data_stringutilisant json_encode()??? Ne voyez pas cette ligne de code ...
shadyyx
Désolé je n'ai pas écrit ici mais dans mon code j'ai écrit code$ data_string = json_encode ($ data); codeet comment écrire du code dans les commentaires? dans les commentaires je ne peux pas écrire de saut de ligne et donc comment écrire du code?
user1463076

Réponses:

193

Vous postez incorrectement le json - mais même s'il était correct, vous ne pourrez pas tester en utilisant print_r($_POST)( lisez pourquoi ici ). Au lieu de cela, sur votre deuxième page, vous pouvez attraper la requête entrante en utilisant file_get_contents("php://input"), qui contiendra le json POSTed . Pour afficher les données reçues dans un format plus lisible, essayez ceci:

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

Dans votre code, vous indiquez Content-Type:application/json, mais vous n'encodez pas json toutes les données POST - uniquement la valeur du champ POST "client". À la place, faites quelque chose comme ceci:

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

Note de bas de page: Vous pourriez bénéficier de l'utilisation d' une bibliothèque tierce au lieu de vous connecter directement avec l'API Shopify.

Stephen M. Harris
la source
1
Hah! Je me demandais pourquoi je ne recevais pas les données via $ _POST. Le problème était que je devais utiliser l'entrée php: // comme vous l'avez dit. Merci.
YOMorales
vous n'avez donc pas à spécifier explicitement qu'il s'agit d'une demande POST? Son connu parce que CURLOPT_POSTFIELDS est défini?
Srneczek
où était cette réponse quand je la cherchais toute la semaine dernière? Maintenant, je le trouve bien après avoir dû me comprendre!
pythonian29033
Note de bas de page: Si vous envoyez JSON et attendez JSON comme réponse, certaines API nécessitent également de définir le type de réponse curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Accept:application/json'));(sinon, vous pouvez envoyer JSON, mais obtenir XML comme réponse).
pixelbrackets
2
vous avez sauvé la journée
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);

Ce code a fonctionné pour moi. Tu peux essayer...

roki stellaire
la source
13

Remplacer

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

avec:

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

Je ne comprends pas ce que vous entendez par "autre page", j'espère que c'est la page à: 'url_to_post'. Si cette page est écrite en PHP, le JSON que vous venez de publier ci-dessus sera lu de la manière ci-dessous:

$jsonStr = file_get_contents("php://input"); //read the HTTP body.
$json = json_decode($jsonStr);
UltraInstinct
la source
Pourquoi supposeriez-vous cela? S'il met les données dans le champ «client», il doit le faire pour une raison, non?
Okonomiyaki3000
Oui, merci, j'ai raté cette partie. Mais lui, l'OMI, le fait mal. Je mettrai à jour ma réponse avec.
UltraInstinct
Aucune des solutions ci-dessus ne fonctionne pour obtenir des données json dans un fichier php :(
Gohel Kiran
7

Veuillez essayer ce 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
la source
3

Essayez cet exemple.

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

Votre code page2.php

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

?>
Prasad Rajapaksha
la source
1

Essayez comme ceci:

$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 chose clé que vous avez oublié était de json_encode vos données. Mais vous pouvez également trouver pratique d'utiliser curl_setopt_array pour définir toutes les options curl en même temps en passant un tableau.

Okonomiyaki3000
la source
-1. Vérifiez l'API ici: api.shopify.com/customer.html#create . Le corps que le serveur attend dans JSON, pas urlencoded-json. Vérifiez ma réponse, pas besoin de l'utiliser array(..)dans `CURLOPT_POSTFIELDS
UltraInstinct
Oui, comme je l'ai dit, il l'envoie mal. Passer un array(..)à CURLOPT_POSTFIELDS` codera également le JSON.
UltraInstinct
Quoi qu'il en soit, j'ai essayé plusieurs fois avec un code différent, mais je n'ai pas pu le faire en json maintenant je l'ai fait avec succès en xml.
user1463076