使用 Guzzle 在 Laravel 中创建代理
Creating a proxy in Laravel with Guzzle
我需要在我的网站前端使用 api,但我不想向我的前端用户公开 api 的密钥,所以我决定制作一个代理人。但是,我认为我不一定以最干净的方式完成它,straight-forward、Laravel-like 或 Guzzle-like 方式。我会展示我的作品:
在 web.php 中,我添加了一条如下所示的路由: Route::post('/address-api/{path?}', 'Controller@addressApi')->where('path', '.*');
这样,/address-api
之后的整个路径都传递到我的控制器,因此我可以假设代理任何 post 请求 api.
然后在 Controller.php
我做了这个:
public function addressApi($path, Request $request)
{
if (!Str::startsWith($path, '/')) $path = '/' . $path; // make sure it starts with /
$url = 'https://api.craftyclicks.co.uk/address/1.1' . $path;
$postData = $request->all();
$postData['key'] = env('CRAFTYCLICKS_KEY');
$client = new Client();
$response = $client->request('POST', $url, [
'json' => $postData
]);
return response()->json(json_decode($response->getBody(), true));
}
所以,无论 json 他们 post 到我的 api,我 post 到 CraftyClicks api,但我将我们的密钥添加到json。上面的代码是有效的,只是看起来不是正确的方法。
我不确定的是 json_decoding body 和 returning 它,return response()->json(json_decode($response->getBody(), true));
。我觉得这有点……肮脏。我觉得必须有一种更简洁的方法来 return 实际的 API 响应与它进来时完全一样。
起初我在做 return $response->getBody();
,但我不喜欢那样,因为当我那样做时它的响应中没有 Content-type: application/json
header。 Guzzle 是否提供开箱即用的方法来 return 完整地 as-is、header 和所有?
让Laravel有输出;这个更干净。
return response($response->getBody())
->withHeaders($response->getHeaders());
我需要在我的网站前端使用 api,但我不想向我的前端用户公开 api 的密钥,所以我决定制作一个代理人。但是,我认为我不一定以最干净的方式完成它,straight-forward、Laravel-like 或 Guzzle-like 方式。我会展示我的作品:
在 web.php 中,我添加了一条如下所示的路由: Route::post('/address-api/{path?}', 'Controller@addressApi')->where('path', '.*');
这样,/address-api
之后的整个路径都传递到我的控制器,因此我可以假设代理任何 post 请求 api.
然后在 Controller.php
我做了这个:
public function addressApi($path, Request $request)
{
if (!Str::startsWith($path, '/')) $path = '/' . $path; // make sure it starts with /
$url = 'https://api.craftyclicks.co.uk/address/1.1' . $path;
$postData = $request->all();
$postData['key'] = env('CRAFTYCLICKS_KEY');
$client = new Client();
$response = $client->request('POST', $url, [
'json' => $postData
]);
return response()->json(json_decode($response->getBody(), true));
}
所以,无论 json 他们 post 到我的 api,我 post 到 CraftyClicks api,但我将我们的密钥添加到json。上面的代码是有效的,只是看起来不是正确的方法。
我不确定的是 json_decoding body 和 returning 它,return response()->json(json_decode($response->getBody(), true));
。我觉得这有点……肮脏。我觉得必须有一种更简洁的方法来 return 实际的 API 响应与它进来时完全一样。
起初我在做 return $response->getBody();
,但我不喜欢那样,因为当我那样做时它的响应中没有 Content-type: application/json
header。 Guzzle 是否提供开箱即用的方法来 return 完整地 as-is、header 和所有?
让Laravel有输出;这个更干净。
return response($response->getBody())
->withHeaders($response->getHeaders());