2017-04-19 138 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

相關問題