我認爲你是在正確的道路上。您在這裏處理的幾個問題。第一個是錯誤處理,而第二個是錯誤格式化。
錯誤處理可以通過多種方式完成,拋出異常是其中之一。爲了找出何時壞事發生了,你需要一個try/catch塊中包裝你的例外:
try {
//logic
if(mysqli_connect_errno()) {
throw new Exception("Can't connect to db.");
}
//more logic
} catch (Exception $e) {
//handle the error here
}
如果您遵循這條路線,我建議你在更具體你的例外,所以你可以更好地在你的API中構建你的反應。它不具有DB不是不能夠找到的資源,例如上下一致:
try {
//logic
if(mysqli_connect_errno()) {
throw new DBException("Can't connect to db.");
}
if(is_null($entity)) {
throw new ResourceNotFoundException("Entity could not be found");
}
//more logic
} catch (DBException $e) {
//handle DB error here
} catch (ResourceNotFoundException $e) {
//handle resource not found error here
}
現在的格式化部分,在REST API的正常反應是JSON響應。一種方式去了解它,是創建一個特定的類,其唯一職責是將您的響應轉換成一個有效的JSON:
...
} catch (DBException $e) {
return $this->JSONResponse->format("Sorry we could not complete your request", 500);
} catch (ResourceNotFoundException $e) {
return $this->JSONResponse->format("The resource you were looking for could not be found", 404);
}
正如你所看到的,不同的錯誤有不同的狀態代碼。類的實現並不重要:
class JSONResponse {
public function format($message, $statusCode) {
return json_encode(['message' => $message, 'code' => $statusCode]);
}
}
這不會改變,雖然響應,這是很好的REST API的設計必不可少的狀態代碼。您需要使用this function來設置適當的狀態碼。
您可以在Symfony HTTPFoundation Component中找到這個類的更健壯和更靈活的實現,它從正常的Response類擴展而來。
你可以用'try'' catch'塊來抓取異常,然後以'json'格式輸出 –
@Richie,這當然是很簡單的方法。用默認錯誤創建一個錯誤類不是更好嗎? –
我認爲把你的錯誤打印成JSON實際上是最好的方法 - 如果你創建自己的類或捕捉異常是品嚐。我會使用兩者的組合,而僅將異常用於真正的異常錯誤 - 但最終客戶端會知道是否一切都出錯了,無論是接收JSON格式的錯誤還是完全不接收JSON。 –