How to POST JSON Data With PHP cURL?

2019-01-01 13:51发布

问题:

Here is my code,

    $url = \'url_to_post\';
    $data = array(\"first_name\" => \"First name\",\"last_name\" => \"last name\",\"email\"=>\"email@gmail.com\",\"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);

And at other page, I am retrieving post data.

    print_r ($_POST);

Output is

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

So, I am not getting proper data even at my own server, it\'s empty array. I want to implement REST using json as at http://docs.shopify.com/api/customer#create

回答1:

You are POSTing the json incorrectly -- but even if it were correct, you would not be able to test using print_r($_POST) (read why here). Instead, on your second page, you can nab the incoming request using file_get_contents(\"php://input\"), which will contain the POSTed json. To view the received data in a more readable format, try this:

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

In your code, you are indicating Content-Type:application/json, but you are not json-encoding all of the POST data -- only the value of the \"customer\" POST field. Instead, do something like this:

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

Sidenote: You might benefit from using a third-party library instead of interfacing with the Shopify API directly yourself.



回答2:

Replace

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

with:

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

I dont get what you meant by \"other page\", I hope it is the page at: \'url_to_post\'. If that page is written in PHP, the JSON you just posted above will be read in the below way:

$jsonStr = file_get_contents(\"php://input\"); //read the HTTP body.
$json = json_decode($jsonStr);


回答3:

Please try this code:-

$url = \'url_to_post\';

$data = array(\"first_name\" => \"First name\",\"last_name\" => \"last name\",\"email\"=>\"email@gmail.com\",\"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\";


回答4:

$url = \'url_to_post\';
$data = array(\"first_name\" => \"First name\",\"last_name\" => \"last name\",\"email\"=>\"email@gmail.com\",\"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);

This code worked for me. You can try...



回答5:

Try this example.

<?php 
 $url = \'http://localhost/test/page2.php\';
    $data = array(\"first_name\" => \"First name\",\"last_name\" => \"last name\",\"email\"=>\"email@gmail.com\",\"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;
?>

Your page2.php code

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

?>


回答6:

Try like this:

$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@gmail.com\",\"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);

The key thing you\'ve forgotten was to json_encode your data. But you also may find it convenient to use curl_setopt_array to set all curl options at once by passing an array.



标签: php json rest curl