可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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.