【发布时间】:2021-11-05 18:36:00
【问题描述】:
我需要在我的网站前端使用一个 api,但我不想将那个 api 的密钥暴露给我的前端用户,所以我决定做一个代理。然而,我不认为我必须以最干净、最直接、类似 Laravel 或 Guzzle 的方式完成它。我会展示我的作品:
在 web.php 中,我添加了一个如下所示的路由:Route::post('/address-api/{path?}', 'Controller@addressApi')->where('path', '.*'); 这样,/address-api 之后的整个路径将传递给我的控制器,因此我可以假设将任何发布请求代理到该 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));
}
所以,无论他们发布到我的 api 中的什么 json,我都会发布到 CraftyClicks api,但我会将我们的密钥添加到 json 中。上面的代码可以正常工作,只是看起来不是正确的方法。
我不确定的是 json_decoding 正文并返回它,return response()->json(json_decode($response->getBody(), true));。我觉得这有什么……肮脏的。我觉得必须有一种更简洁的方式来完全返回实际的 API 响应。
一开始我在做return $response->getBody();,但我不喜欢这样,因为当我这样做时,响应中没有Content-type: application/json 标头。 Guzzle 是否提供了一种开箱即用的方式来完全按原样返回他们的响应、标题和所有内容?
【问题讨论】: