我需要从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,希望它对其他人有用。
答案 0 :(得分:1)
您可以设置Guzzle,以便在出现错误时抛出异常。这是" http_errors"构造函数中的参数,您需要将其设置为" true"。
然后,您可以使用一些全局处理程序以相同的方式处理所有异常。请查看set_exception_handler()。
我认为这会使代码变得更简单,并且您仍然可以在需要时捕获单个异常,方法是将调用包装在try / catch块中。