2016-02-16 75 views
0

我想知道這是實現RESTAPI誤差的方法,其實如果我的課的方法產生例外,我回到這個...如何在Rest API中實現錯誤?

if(mysqli_connect_errno()) { 
    throw new Exception("Can't connect to db."); 
} 

...但是這是一個不好的做法「的原因一個API應該返回一個JSON。

所以我的想法是創建一個名爲Errors的類,在每個類中,當發生錯誤時,我只需調用顯示json錯誤的相對錯誤號。

有人有另一種想法嗎?

+1

你可以用'try'' catch'塊來抓取異常,然後以'json'格式輸出 –

+0

@Richie,這當然是很簡單的方法。用默認錯誤創建一個錯誤類不是更好嗎? –

+1

我認爲把你的錯誤打印成JSON實際上是最好的方法 - 如果你創建自己的類或捕捉異常是品嚐。我會使用兩者的組合,而僅將異常用於真正的異常錯誤 - 但最終客戶端會知道是否一切都出錯了,無論是接收JSON格式的錯誤還是完全不接收JSON。 –

回答

3

也許像這樣:

<?php 

try { 
    // Do your stuff 
    if(mysqli_connect_errno()) { 
     throw new Exception("Can't connect to db."); 
    } 
} catch (Exception $e) { 
    echo json_encode(array("success" => false, "message" => $e->getMessage())); 
    return; 
} 
+0

問題是,在響應(例如)我得到這個=>'警告mysqli_connect():未知數據庫x',後來我得到:'{「success」:false,「消息:等....'我只想打印json –

+1

@SevengamesXoom只要刪除error_reporting,我認爲它是唯一的方法 – Gwendal

+0

你是對的,謝謝:) –

1

我覺得@Gwendal答案是好的,但它沒有足夠的只是返回一個JSON響應,你也必須回到正確的HTTP代碼:

<?php 

try { 
    // Do your stuff   
} catch (Exception $e) { 
    header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500); 
    echo json_encode(array("success" => false, "message" => $e->getMessage())); 
    return; 
} 
+0

這就是應該如何實現REST API。 –

2

我認爲你是在正確的道路上。您在這裏處理的幾個問題。第一個是錯誤處理,而第二個是錯誤格式化。

錯誤處理可以通過多種方式完成,拋出異常是其中之一。爲了找出何時壞事發生了,你需要一個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類擴展而來。

0

我的RESTful API總是返回這個結構的JSON:

[ 
    'resource' : [], 

    'code'  : [ 
     'id' : int, 
     'msg' : string 
    ], 

    'meta'  : [], 

    'log'  : [] 
] 

如果我返回數據,該數據始終處於resourcecode['id']始終爲0(表示 'OK')。當出現錯誤時,我會返回一個空的resource和一些錯誤code。我還通過meta提供了一些額外的信息,並可以通過log記錄一些操作,這對我有很大的幫助。

這也可能會幫助您解決將來的問題,例如,如果您想將問題分解成頁面,客戶端應通過GET /path/to/resource/page/:page來請求數據,或者要注意客戶端某個請求路徑已被棄用。