API 请求适用于 cURL 但不适用于 Guzzle?

时间:2021-06-23 06:50:39

标签: php json 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',
                ]
            ))
        ]);

卷曲:

$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 bad request 错误。

1 个答案:

答案 0 :(得分:1)

尝试将 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',
        ]
    )
]);