2013-12-17 2 views
0

Наш разработчик имеет небольшую проблему с API (Brightpearl) и получает «Тело запроса не может быть прочитано при попытке проанализировать его как JSON "при попытке запустить сценарий ниже. У кого-нибудь есть идеи по возможной проблеме? Спасибо заранее.Ошибка «Тело запроса не может быть прочитано при попытке разобрать его как JSON»

<?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 


} 



?> 
+1

Почему вы выполняете '@mysql_error()'? Удалите эти '@'. Вам нужно обрабатывать свои ошибки, а не просто игнорировать их. –

+1

Не совсем уверен, но не должна эта строка -> 'curl_setopt ($ ch, CURLOPT_POSTFIELDS, http_build_query ($ newShippingWarehouseDetails));' использовать 'json_encode' вместо' http_build_query'. Вы передаете заголовок типа Content-Type: application/json; charset = UTF-8, но передаете данные в виде кодированной строки URL-адреса. – War10ck

ответ

1

Я не могу быть полностью уверен, но я считаю, ваша проблема заключается второй curl запроса. Вы передаете заголовок ->Content-Type: application/json;charset=UTF-8 < - с вашего запроса. Тем не менее, ваша кодировка ваших данных как строка URL-адреса ->CURLOPT_POSTFIELDS,http_build_query($newShippingWarehouseDetails));.

Попробуйте это:

Изменить это:

CURLOPT_POSTFIELDS,http_build_query($newShippingWarehouseDetails)); 

к этому:

CURLOPT_POSTFIELDS, json_encode($newShippingWarehouseDetails)); 

Если данные правильно кодируются как JSON, я дон Не думаю у вас должна быть проблема.

+0

Спасибо за предложение, но к счастью, к сожалению! – Jack

Смежные вопросы