【问题标题】:Creating a proxy in Laravel with Guzzle使用 Guzzle 在 Laravel 中创建代理
【发布时间】: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 是否提供了一种开箱即用的方式来完全按原样返回他们的响应、标题和所有内容?

【问题讨论】:

    标签: php laravel guzzle


    【解决方案1】:

    让 Laravel 有输出;这样更干净。

    return response($response->getBody())
                ->withHeaders($response->getHeaders());
    

    【讨论】:

    • 谢谢,这可能就是我要找的。我很快就会对此进行测试。
    • @TKoL alse Guzzle 提供 getRawHeaders() 但 Laravel 不提供附加原始标题作为响应。
    猜你喜欢
    • 2016-02-13
    • 1970-01-01
    • 2017-11-19
    • 2018-04-28
    • 2015-09-04
    • 1970-01-01
    • 2015-11-26
    • 2020-11-19
    • 2016-05-12
    相关资源
    最近更新 更多