使用 Laravel / Guzzle 的 Http 客户端请求

问题描述 投票:0回答:3

我正在尝试在 Laravel 中发出 http 客户端请求。我试过直接使用 guzzle 并且它有效,但是当通过 laravel 中的“Guzzle HTTP 客户端周围的 API”进行操作时,我总是得到 400。 我找不到错误在哪里,因为它似乎是正确的。 我举两种情况的例子:

$method = 'post', route 和 $headers 也是一样的

Guzzle(200 次成功):

    $client = new \GuzzleHttp\Client();
    $response = $client->request($method, $this->BASEURL . $endpoint, [
        'body' => '{"name":"testName"}',
        'headers' => $headers,
      ]);

Laravel http 客户端(400 错误请求):

    $response = Http::withHeaders($headers)->withBody('{"name":"testName"}', 'application/json')->{$method}($this->BASEURL . $endpoint);   

编辑 使用 guzzle 的 AirbnbAPI 示例:

<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.airbnb.com/v2/listings', [
  'body' => '{"name":"erer"}',
  'headers' => [
    'X-Airbnb-API-Key' => 'XXXXXXXX',
    'X-Airbnb-OAuth-Token' => 'XXXXXX',
    'X-Airbnb-Req-Api-Version' => '2022.12.31',
    'accept' => 'application/json',
    'content-type' => 'application/json',
  ],
]);

echo $response->getBody();
laravel guzzle laravel-10
3个回答
0
投票

你用错了

HTTP
包。我们在 Laravel 中使用
HTTP
包的方式是利用
GuzzleHTTP
use GuzzleHttp\Psr7\Utils;
例如代码可以是这样的:

use GuzzleHttp\Psr7\Utils;
....
$response = Http::withHeaders($headers)->withBody(Utils::streamFor('{"name":"testName"}'), 'application/json')->{$method}($this->BASEURL . $endpoint);

您可以在 Laravel 官网了解更多关于 GuzzleHTTP 包的信息文档


0
投票

调用方法时可以直接传入json body作为第二个参数:

    $response = Http::withHeaders($headers)->{$method}($this->BASEURL . $endpoint, ['name' => 'testName']);   

默认情况下,数据将使用 application/json 内容类型发送。


0
投票

如果您的

$headers
数组有一个“内容类型”键,它不是
Content-Type
,那么问题可能是您发送了多个内容类型标题。

例如,如果您的

$headers
数组有一个
content-type
键,那么通过调用
withHeaders()
,您正在设置
content-type
标题。

下一次调用

withBody()
会将
Content-Type
标头设置为
application/json
.

由于标头名称是数组中的键,并且它们不相同(数组键区分大小写),因此标头数组将同时包含

content-type
标头和
Content-Type
标头,并且两者都将被发送在请求中。

您需要从

content-type
变量中删除
$headers
条目,或者您需要确保它被设置为
Content-Type
以便 Http 客户端将正确覆盖它。

© www.soinside.com 2019 - 2024. All rights reserved.