简体   繁体   中英

Sending a JSON Request to API using cURL

I have seen examples of people sending JSON data in an array. An using cURL to send the data. Problem is most of them are something like

    $data = array('first_name' => 'Thomas', 'last_name' => 'Woods')

My question is, if I have something like below that isnt as dry cut. Example:

    "products": [
{
  "product_id": "B00I9KDFK0",
  "quantity": 1,
  "seller_selection_criteria": [
    {
      "condition_in": ["New"],
      "international": false,
      "handling_days_max": 5
    }
  ]
}

],

So how would I put that info into an Array?

More Info: Ive tried the following with no luck

    <?php
    // Your ID and token


    // The data to send to the API
    $postData = array(
        'client_token' => 'XXXXXXXXXXXXXXXXXXXXXX',
        'retailer' => 'amazon',
        'products' => array('product_id' => '0923568964', 'quantity' => '1',                       'seller_selection_criteria' => array('condition_in' => 'New', 'international' =>         'false', 'handling_days_max' => '5')),
        'max_price' => '1300',
        'shipping_address' => array('first_name' => 'Thomas', 'last_name' =>             'XXXXX', 'address_line1' => 'XXXXXX Loop', 'address_line2' => '', 'zip_code' =>         'XXXXX', 'city' => 'XXXX', 'state' => 'MS', 'country' => 'US', 'phone_number' =>         'XXXXXX'),
'is_gift' => 'false',
'gift_message' => "",
'shipping_method' => 'cheapest',
'payment_method' => array('name_on_card' => 'XXXXXXXX', 'number' => 'XXXXXXXXXXXX', 'security_code' => 'XXX', 'expiration_month' => 'XX', 'expiration_year' => 'XXXX', 'use_gift' => 'false'),
'billing_address' => array('first_name' => 'Thomas', 'last_name' => 'XXXXXX', 'address_line1' => 'XXXXXXXXX', 'address_line2' => '', 'zip_code' => 'XXXXXX', 'city' => 'XXXXXXXX', 'state' => 'MS', 'country' => 'US', 'phone_number' => 'XXXXXXXX'),
'retailer_credentials' => array('email' => 'XXXXXXXX', 'password' =>         'XXXXXXXXX')
    );

    // Setup cURL
    $ch = curl_init('https://api.zinc.io/v0/order');
    curl_setopt_array($ch, array(
CURLOPT_POST => TRUE,
CURLOPT_RETURNTRANSFER => TRUE,
CURLOPT_POSTFIELDS => json_encode($postData)
    ));

    // Send the request
    $response = curl_exec($ch);

    // Check for errors
            if($response === FALSE){
        die(curl_error($ch));
    }

    // Decode the response
    $responseData = json_decode($response, TRUE);

    // Print the date from the response
    echo $responseData['published'];
    echo $response;
    ?>

There error im getting is:

    {"_type":"error","_request_id":"5663c16b75f682d920000758","code":"invalid_request","message":"Validation failed on the request.","data":{"validator_errors":[{"value":[],"path":"products","message":"'' is not a permitted value for 'products' field."}]},"host":"zincapi-5","offers_urls":[],"screenshot_urls":[],"_created_at":"2015-12-06T05:02:35.567Z"}

Here is the code from the Echo of Json_echo

    {"client_token":"xxxxxxxxxxxxxxxxxxxxxxx","retailer":"amazon","products":{"product_id":"0923568964","quantity":1,"seller_selection_criteria":{"condition_in":"New","international":false,"handling_days_max":5}},"max_price":"1300","shipping_address":{"first_name":"Thomas","last_name":"xxxxxx","address_line1":"xxxxx","address_line2":"","zip_code":"xxxx","city":"xxxxx","state":"MS","country":"US","phone_number":"xxxxxx"},"is_gift":"false","gift_message":"","shipping_method":"cheapest","payment_method":{"name_on_card":"xxxxxxxxxx","number":"xxxxxxxxxxxxx","security_code":"xxxx","expiration_month":"xx","expiration_year":"xxxx","use_gift":false},"billing_address":{"first_name":"Thomas","last_name":"xxxxx","address_line1":"xxxxxxx","address_line2":"","zip_code":"xxxx","city":"xxxxxx","state":"MS","country":"US","phone_number":"xxxxxx"},"retailer_credentials":{"email":"xxxxxxxxxx","password":"xxxxxxxxxx"}}

You should be able to use json_encode() which will put it into a properly formatted array.

After reading your response and the error you were getting back from the API you are making the request to, I think the error has to do with the format of your request.

If you look at their API documentation you'll see that it's expecting an array of products. You are only sending one, but it will need to be in an array format. Here is what it is expecting:

"products": [
{
  "product_id": "0923568964",
  "quantity": 1,
  "seller_selection_criteria": [
    {
      "condition_in": ["New"],
      "international": false,
      "handling_days_max": 5
    }
  ]
}

],

So, to change this, you'll need to update the products key of your array to:

'products' => array(array('product_id' => '0923568964', 'quantity' => '1','seller_selection_criteria' => array('condition_in' => 'New', 'international' =>'false', 'handling_days_max' => '5'))),

If you noticed, I put an array declaration around the array of your product details. If you had a second product, you'd put a comma after your first array of product details and add a second.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM