2017-04-19 139 views
0

我有两个Laravel应用程序,一个是从另一个调用API。如何从另一个Laravel应用程序捕获Laravel错误?

如果请求应用程序发送无效数据,API调用Laravel的“中止”函数。

但是,我似乎无法赶上请求应用程序端的这个错误。下面是一些代码:

请求的应用程序:

$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

if ($method == 'POST') { 
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));  
} 

$result = curl_exec($ch); 

Log::info($result); 

curl_close($ch); 

而且我接收应用程序:

if ($result == '') { 
    $error = 'An unexpected error occurred fetching shipping rates. If this error persists, please contact support.'; 
    abort(400, $error, array('errorText'=>$error)); 
    $error = true; 
} 

现在,我不能特别修改我的接收应用程序的错误处理,因为该应用程序已正确处理这些错误信息。

但是在我的请求应用程序中,Log::info调用的结果是深度嵌入错误代码的整个HTML。

我似乎无法得到没有一些自定义字符串解析的消息,但我觉得应该有一些方法知道它失败并检索该错误消息。

有什么想法?

回答

0

不能捕获异常,但你可以为不同的状态代码添加不同的逻辑返回,在这种情况下,400

$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
if ($statusCode == 400) { 
    // Do things 
} 

如何在一个更通用的方式来处理,这是真正达到你以及你希望你的API行为如何。例如,如果您想向API添加授权并且有人通过了无效凭证,那么您可能需要abort(401)这意味着未经授权。你可以在这里看到一个状态码列表,以及它们的含义... https://en.wikipedia.org/wiki/List_of_HTTP_status_codes

如果你是唯一一个使用这项服务的人,那么真正取决于你如何深入你需要到达这里。一般来说,200范围内的任何内容都意味着它是成功的,因此您可能需要检查状态码是否为200,否则您可能会认为有错误。

关于如何从HTML中获取错误信息,确实没有一个好的方法来做到这一点,而且你真的不应该这么做。更好的解决方案是改变你的API,以便它不返回所有的HTML,而是返回更容易被解析出来的响应。例如,如果您的API返回JSON,那么当出现错误时,您可能希望返回带有错误消息,状态代码和任何其他可能有用的信息的JSON响应。为此,您需要更改app/Exceptions/Handler.php,以便知道它需要返回JSON响应而不是错误的HTML。

您也可以找到修改的错误响应有帮助的,它可以在这里找到的文件... https://laravel.com/docs/5.4/errors#the-exception-handler

具体来说,它看起来像你将需要更改render方法。在返回它作为JSON的情况下,可能需要这个样子......

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $exception 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $exception) 
{ 
    return response()->json([ 
     'message' => $exception->getMessage(), 
     'code' => $exception->getCode(), 
    ]); 

    // return parent::render($request, $exception); 
} 

这将只返回错误信息和状态代码。

+0

嗯,我刚刚试过这个,并记录statusCode被返回,并出于某种原因,它是0,而不是400. – Rail24

+0

这很奇怪,你使用'curl_close'之前呢? – user3158900

+0

是的,但它也在'curl_exec'之前。傻我。现在有没有一种通用的方法来查明它是否是一个错误,除了将它与400进行比较? – Rail24

相关问题