【问题标题】:GuzzleHTTP Post request body contains queryGuzzleHTTP Post 请求正文包含查询
【发布时间】:2019-03-24 02:26:06
【问题描述】:

我正在尝试通过 GuzzleHTTP 与外部应用程序(运行 Laravel)进行通信,并且数据被正确发布和返回,但是我将我发布的参数返回到正文响应中 - 这使得 json_decode() 不起作用正确。

有没有人知道如何解决这个问题?我真的找不到任何关于它的信息,也找不到 GuzzleHTTP 或谷歌搜索的文档。

我想使用正则表达式会起作用,但如果可能的话,我想使用一种不那么脆弱的方法。

我得到的回复如下(编码为json字符串):

字符串(39) "aUnid%5B0%5D=20005&aUnid%5B1%5D=2008026"\n "你好" 如您所见,在这种情况下,它会将我的论点与结果(即“hello”)一起发布。

用于发布数据的代码是这样的:

$http = new \GuzzleHttp\Client([
    'base_uri' => $baseUrl
]);

$uri = "/api/deliveries/read";
$response = $http->request("POST", $uri, [
    'headers' => [
        'Authorization' => "Bearer " . $accessToken,
        'Content-Type' => 'application/json',
        'Accept' => 'application/json',
    ],
    GuzzleHttp\RequestOptions::JSON => [
        'kmUnids' => [
            20005, 2008026
        ]
    ],
    'timeout' => 5
]);

echo $response->getBody();

外部应用程序中使用的代码如下:

/**
 * @param Request $request
 * @return JsonResponse
 */
public function getData (Request $request) : JsonResponse
{
    $request->validate([
        'kmUnids' => 'required|min:1|array'
    ]);
    /** @noinspection PhpUndefinedFieldInspection */
    $ids = $request->kmUnids;


    return \Response::json(
        "hello"
    );
}

两个应用程序都在运行 Laravel (5.7) 并使用我正在使用 Laravel Passport 进行 OAUTH2 通信。

【问题讨论】:

  • 对于 POST 请求,我建议您坚持使用 GuzzleHttp\Psr7\Request 并将其与 GuzzleHttp\Client::request 方法结合使用。
  • 当我使用GuzzleHttp\Psr7\Request 并使用GuzzleClient\Client::send 命令发送它时,服务器会获取请求并正确处理它,但是当我执行getBody() 方法时,它只会给我我定义的主体应该发送。 kmUnids=...。您告诉我使用的 request() 方法不接受 Psr\Http\Message\RequestInterface 作为参数。
  • 我可以通过使用explode("\n", (string) $response->getBody());来分离查询和结果来解决整个问题,但是感觉很脏..
  • 请仔细阅读,我没有告诉你使用request方法。

标签: php laravel post guzzle


【解决方案1】:

你应该像这样解码你的返回结果:

$return_result=json_decode($response->getBody()); $data = $res->数据;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    • 2011-04-30
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-04
    相关资源
    最近更新 更多