首页 > 解决方案 > Laravel HTTP 客户端不适用于空正文,但 Postman 有效

问题描述

因此,在尝试访问 PayPal 的 API 端点时,我遇到了 Laravel HTTP 客户端的一个有趣问题。

我可以让 Laravel HTTP 客户端在我所有使用数据 POST 的端点上工作,但是这个需要标头(没有数据在正文中传递)的端点因错误而失败。

{
   "name":"INVALID_REQUEST",
   "message":"Request is not well-formed, syntactically incorrect, or violates schema.",
   "debug_id":"609388c4ddfe4",
   "details":[
      {
         "field":"\/",
         "location":"body",
         "issue":"INVALID_SYNTAX",
         "description":"MALFORMED_REQUEST_JSON"
      }
   ],
   "links":[
      {
         "href":"https:\/\/developer.paypal.com\/docs\/api\/orders\/v2\/#error-INVALID_SYNTAX",
         "rel":"information_link",
         "encType":"application\/json"
      }
   ]
}

当我在 Postman 中到达同一个端点时,一切正常

我到达端点的方法如下所示

public static function capture($order)
{
  $token =  Paypal::fetchToken();
  $api_url = config('services.paypal.api_url') . '/v2/checkout/orders/' . $order['id'] . '/capture';
  
  $headers = [
     'Content/Type'  => 'application/json',
  ];

  $response = Http::withToken($token)
  ->withHeaders($headers)
  ->post($api_url)
  ->json();

  return $response;
}

根据我收到的错误,我只能假设请求正确地到达端点,但是当我将其留空时,HTTP 包装器或 guzzle 本身正在向正文添加一些内容,这导致 PayPal 抛出错误。我真的不知道我还能尝试什么。

是否有一个参数我忽略了在发布请求中指定空正文?

任何帮助表示赞赏。

标签: laravelpostmanguzzlepaypal-rest-sdk

解决方案


我有同样的问题,但我用一个简单的技巧解决了它。
我在https://docs.guzzlephp.org/en/stable/request-options.html#json上找到了解决方案。

这段代码应该可以工作。

$response = Http::withToken($token)
  ->withHeaders($headers)
  ->post($api_url,['json' => []])
  ->json();

空数组现在被视为 JSON 中的空数组/主体。


推荐阅读