使用代理

时间:2017-11-26 00:40:34

标签: php laravel api guzzle6

我试图使用laravel中的guzzle来访问来自外部API的图像,但是,可以理解的是,这些调用变得非常昂贵并且对页面加载时间产生了极大的影响。我知道代理调用可以解决这个问题,然而,是否有任何方法可以在laravel中实现这一点,其中某个端点可以充当代理并可以返回图像。感谢

1 个答案:

答案 0 :(得分:0)

我找到了解决自己问题的方法,并会发布答案。请注意,有更好的解决方案,即配置服务器来处理此类调用。但是,在Laravel的背景下,我就是这样做的。

我必须使用的数据

[
      "orientation" => "portrait"
      "fig_type" => "diagram"
      "id" => "A_SDEF-05-2016-0003001"
      "position" => "float"
      "label" => "Figure 1."
      "caption" => "some caption"
      "link" => "/resource/id/A_SDEF-05-2016-0003001.tif"
   ]

解决方案:

第1步   使用Laravel中的集合在其函数中循环遍历数据;

// Pass the link as a get request parameter to laravel route
// i.e. localhost/proxy/image?link=resource/id/A_SDEF-05-2016-0003001.tif
return collect($images)->each(function ( $image ) 
{
        if ($image['link']) {
            $image['link'] = ltrim($image['link'],'/');
            return $image['link'] ="link={$image['link']}";
        }
        return $image;
 });

第2步   在路径文件中注册端点,例如

Route::get('/proxy/image', 'ProxyController@request_image');

第3步   控制器方法,即request_image发出Guzzle请求,并将响应返回为:

$link = request('link');

return \Response::stream(function() use($image){
        echo $image;
    },200, [$headers]);

第4步   有一个静态函数或常规函数来输出你将构建的一些动态html但是在img src中你会调用ProxyController图像方法,即

  $img = '<img src="'. action('ProxyController@request_image',$image['link']).'") >";

- 步骤5    输出刀片中的html

{!! Asset::image($image) !!} // Just output the built html

希望它有所帮助:D