RoboPHP
RoboPHP

Reputation: 420

Passing JSON data using CURL

I am using a CURL post to an existing API. The API returns the error content must be JSON or plain text. I json_encode data and post the encoded data to the API.

In the API, it says the Content-Type should be application/x-www-form-urlencoded'.

However, it still returns the error content must be JSON or plain text. What could be the issue with my code below after submitting my data in JSON format?

This is a sample request body in the API doc.

"item" : "Store",
"content" : {
        "channel":"false",
        "hop": "false",
        "msg": "Order successfully placed."
}

Controller

 public function postUrl()
    {
        $url = "https://api.com/"; 
        $data = array("item" => "Nike Shoes","content" => array ("channel" => "false" ,"hop" => "false","msg" => "Item Sold"));
        $postdata = json_encode($data);
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
        $result = curl_exec($ch);
        curl_close($ch);
        Log::info($postdata);    
    }

Upvotes: 1

Views: 267

Answers (1)

Hackimov
Hackimov

Reputation: 172

Perhaps this is because boolean values are specified as strings.

public function postUrl()
{
    $url = 'https://api.com/';
    $data = [
        'item' => 'Nike Shoes',
        'content' => [
            'channel' => false,
            'hop'     => false,
            'msg'     => 'Item Sold'
        ]
    ];
    $postData = json_encode($data);
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    $result = curl_exec($ch);
    curl_close($ch);
    Log::info($postData);
}

Also try this

public function postUrl()
{
    $url = 'https://api.com/';
    $data = [
        'item' => 'Nike Shoes',
        'content' => [
            'channel' => 'false',
            'hop'     => 'false',
            'msg'     => 'Item Sold'
        ]
    ];
    $postData = json_encode($data);
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: text/json']);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
    $result = curl_exec($ch);
    curl_close($ch);
    Log::info($postData);
}

Upvotes: 1

Related Questions