为外部API调用创建包装器

时间:2015-09-16 19:47:22

标签: php laravel-5.1

我需要从L5.1应用程序中使用外部API。到目前为止,我已经安装了Guzzle(6.0),将API网址存储在.env文件中,并在app/Http/Controllers/Controller.php里面我做了这个:

use GuzzleHttp\Client;

abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    protected $API;

    public function __construct() {

        // Init API Client
        $this->API = new \GuzzleHttp\Client([
            'base_uri' => env('API_URL'),
            'http_errors' => false, // false = http errors won't throw Exceptions
            'headers' => [
                'User-Agent' => env('API_UA'),
                'Accept'     => 'application/json',        
            ]
        ]);                     

    }
}

这样我可以在任何控制器中进行API调用:

$call = $this->API->get('users/getAll');
if($call->getStatusCode() != 200 || $call === null){
    $data = ["errors" => "There was an error retrieving the users."];
}else{
    $data = json_decode($call->getBody());
}

return view('users.list', $data);

它可以工作,但正如您所看到的,我需要对每个API调用进行一些检查。

创建具有所有逻辑的包装器的有效方法是什么,所以我可以像这样使用它:

$data = $this->API->get('users/getAll');

return view('users.list', $data);

我将提供商和软件包视为可能的解决方案,但事实上,我对Laravel文档和互联网上的信息感到困惑。

另外,由于这是一个内部项目(公司内部),我认为Package方法不是推荐方式,因为它必须在packagist(AFAIK)上发布。

更新

我终于选择了“包”选项。经过一些研究和一些试验和错误,我最终制作了一个满足我需求的软件包。

我会尝试使包更通用并将其发布到packagist,希望它对其他人有用。

1 个答案:

答案 0 :(得分:1)

您可以设置Guzzle,以便在出现错误时抛出异常。这是" http_errors"构造函数中的参数,您需要将其设置为" true"。

然后,您可以使用一些全局处理程序以相同的方式处理所有异常。请查看set_exception_handler()

我认为这会使代码变得更简单,并且您仍然可以在需要时捕获单个异常,方法是将调用包装在try / catch块中。