Jack
Jack

Reputation: 96

Error "The request body could not be read while attempting to parse it as JSON"

Our developer is having a little problem with an API (Brightpearl) and receiving a "The request body could not be read while attempting to parse it as JSON" message when trying to run the below script. Does anyone have any ideas on the possible issue? Many thanks in advance.

<?php
define ("DB_HOST","localhost");
define ("DB_USER","busi6292_REMOVED");
define ("DB_PASSWORD","REMOVED");
define ("DB_DATABASE","busi6292_REMOVED");

$link = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)
or die ('I cannot connect to the database because: ' . @mysql_error());
@mysql_select_db (DB_DATABASE);
mysql_set_charset('utf8',$link);

// Brightperl Data Access Start

    $authenticationDetails = array(
    'apiAccountCredentials' => array(
        'emailAddress' => 'REMOVED',
        'password'     => 'REMOVED',
    ),
    );
    $encodedAuthenticationDetails = json_encode($authenticationDetails);
    $authenticationUrl = 'https://ws-eu1.brightpearl.com/REMOVED/authorise';

    //$cresponse_token=getdata($url,$authenticationDetails);

    $ch = curl_init(); 

    $headers = array('Content-Type: application/json');
    curl_setopt($ch, CURLOPT_URL, $authenticationUrl);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($authenticationDetails));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    if (false === $response) {
        echo 'Request unsuccessful' . PHP_EOL;
        curl_close($ch);
        exit(1);
    }
    $responseCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $responseBody = json_decode($response);
    curl_close($ch);

    $authorisationToken = $responseBody->response;

// End



$sql = "select * from mail where InvoiceDate ='".date('Y-m-d')."'";
$query = mysql_query($sql);

while($sql_array = mysql_fetch_array($query))
{

    //print_r($sql_array);

    //echo $authorisationToken; exit;


    // Brigtperl API Access for the Orders has been shipped Start

    $ShippingGoodsoutURL = 'https://ws-eu1.brightpearl.com/2.0.0/REMOVED/warehouse-service/goods-note/goods-out/'.$sql_array['OrderNo'];

    $headers = array(
    "brightpearl-auth: {$authorisationToken}",
    'Content-Type: application/json;charset=UTF-8',
    'X-HTTP-Method-Override: PUT',
    );
    $newShippingWarehouseDetails = array(
    "priority" => false,
    "shipping" => 
    array(
            "reference" =>'"'.$sql_array['InvoiceNumber'].'"',
            ),
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $ShippingGoodsoutURL);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_PUT, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    //curl_setopt($ch, CURLOPT_POST, true);
    //curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($newShippingWarehouseDetails));


    curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($newShippingWarehouseDetails));

    $GoodsoutreShippingResponse = curl_exec($ch);
    curl_close($ch);

    print_r($GoodsoutreShippingResponse);

    //exit;

    // End


}



?>

Upvotes: 0

Views: 1285

Answers (1)

War10ck
War10ck

Reputation: 12508

I can't be entirely sure, but I believe your problem lies with the second curl request. You're passing a header -> Content-Type: application/json;charset=UTF-8 <- with your request. However, your encoding your data as a url string -> CURLOPT_POSTFIELDS,http_build_query($newShippingWarehouseDetails));.

Try this:

Change this:

CURLOPT_POSTFIELDS,http_build_query($newShippingWarehouseDetails));

to this:

CURLOPT_POSTFIELDS, json_encode($newShippingWarehouseDetails));

If the data is properly encoded as JSON, I don't think you should have a problem.

Upvotes: 1

Related Questions