API请求可以使用cURL,但不能使用Guzzle



我正在努力让这个请求正常工作,这是我第一次使用Guzzle,我不知道我做错了什么。该请求适用于cURL,但不适用于Guzzle:

枪口:

$res = $client->request('POST', 'https://api.bol.com/retailer/offers', [
'headers' => [
'Authorization' => 'Bearer ' . $jwt,
'Accept' => 'application/vnd.retailer.v5+json',
'content-type' => 'application/vnd.retailer.v5+json'
],
'body' => json_encode(array(
'ean' => (string)$item->ean_number,
'condition' => [
'name' => 'NEW',
],
'reference' => 'NS-'.(string)$item->ean_number,
'unknownProductTitle' => (string)$item->name,
'pricing' => [
'bundlePrices' =>[
'quantity' => 1,
'unitprice' => round($item->default_price->price * 1.21, 2)
],
],
'stock' => [
'amount' => (int)$item->stock,
'managedByRetailer' => false,
],
'fulfilment' => [
'method' => 'FBR',
'deliveryCode' => '2-3d',
]
))
]);

cURL:

$productjson[] = array(
'ean' => $data[4],
'condition' => array('name' => 'NEW', 'category' => 'NEW'),
'onHoldByRetailer' => 'false',
'reference' => "dy".$data[4],
'unknownProductTitle' => $data[1],
'pricing' => array('bundlePrices' => array('quantity' => 1, 'unitPrice' => $data[12])),
'stock'=> array('amount' => $data[13], 'managedByRetailer' => false),
'fulfilment' => array('method' => 'FBR', 'deliveryCode' => '2-3d')
);
$productjson = json_encode($productjson[0], JSON_FORCE_OBJECT);
$response = callAPI('POST', $bearer, 'https://api.bol.com/retailer/offers', $productjson);
function callAPI($method, $bearer, $url, $data, $accept = 'application/vnd.retailer.v4+json', $ignoreheaders = false){
$curl = curl_init();
if(!$ignoreheaders){

curl_setopt($curl, CURLOPT_HEADER, true);
}
switch ($method){
case "POST":
curl_setopt($curl, CURLOPT_POST, 1);
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
break;
case "PUT":
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);                               
break;
case "DELETE":
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE");
if ($data)
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);                             
break;
default:
if ($data)
$url = sprintf("%s?%s", $url, http_build_query($data));
}
// OPTIONS:
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: '.$accept, 'Content-Type: '.$accept,
'Authorization: Bearer '.$bearer));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// EXECUTE:
$result = curl_exec($curl);
if(!$ignoreheaders){
if (strpos($result, 'JWT') !== false) {
$responses[] = 'Epired JWT:'.$result;
$bearer = callBearer('POST', 'https://login.bol.com/token?grant_type=client_credentials', NULL);
$result = curl_exec($curl);
}
if(strpos($result, '504') !== false){
$responses[] = '504 error:'.$result;
sleep(1.1);
$bearer = callBearer('POST', 'https://login.bol.com/token?grant_type=client_credentials', NULL);
$result = curl_exec($curl);
}
if(strpos($result, 'FAILURE') !== false){
$responses[] = 'FAILURE:'.$result;
sleep(1.1);
$bearer = callBearer('POST', 'https://login.bol.com/token?grant_type=client_credentials', NULL);
$result = curl_exec($curl);
}
$header_size = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
$header = substr($result, 0, $header_size);
$body = substr($result, $header_size);
$result = json_decode($body);
return $result;
}

这可能真的很愚蠢,但我基本上只是在问:我如何用guzzle执行工作中的cURL请求?因为我的guzzle请求返回了一个400坏的请求错误。

尝试将body更改为json并传递数组而不是json编码的字符串,Guzzle将负责在内部将此数组转换为json

$res = $client->request('POST', 'https://api.bol.com/retailer/offers', [
'headers' => [
'Authorization' => 'Bearer ' . $jwt,
'Accept' => 'application/vnd.retailer.v5+json',
'content-type' => 'application/vnd.retailer.v5+json'
],
'json' => array(
'ean' => (string)$item->ean_number,
'condition' => [
'name' => 'NEW',
],
'reference' => 'NS-'.(string)$item->ean_number,
'unknownProductTitle' => (string)$item->name,
'pricing' => [
'bundlePrices' =>[
'quantity' => 1,
'unitprice' => round($item->default_price->price * 1.21, 2)
],
],
'stock' => [
'amount' => (int)$item->stock,
'managedByRetailer' => false,
],
'fulfilment' => [
'method' => 'FBR',
'deliveryCode' => '2-3d',
]
)
]);

相关内容

最新更新