使用 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());