【发布时间】: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方法。