Reputation: 96
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
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