2016-02-28 28 views
1

我想寫一個JSON API。JSON API設計 - 快遞

我的問題是,有時我想查詢一個ID,有時爲一個字符串。

一個辦法是增加一個查詢字符串,例如:

example.com/user/RandomName 
example.com/user/1234556778898?id=true 

,並用它喜歡:

api.get('user/:input', function(req, res) { 
    if(req.query.id) { 
    User.find({ '_id': req.params.input }, cb); 
    } else { 
    User.find({ 'name': req.params.input }, cb); 
    } 
}; 

但這似乎是不好的做法對我來說,因爲它導致了一堆的條件表達式。 有沒有更優雅的方式?

回答

2

我會建議處理兩個端點。一個用於通過ID得到全部用戶和一個用於得到SPECIFC用戶。

  1. example.com/users
  2. example.com/users/:id

第二端點可以用來找到ID特定的用戶。

第一個端點可用於查找所有用戶,但過濾器可應用於此端點。

例如:example.com/users?name=RandomName

通過這樣做,你可以非常容易地創建基於在URL中的參數,在您的節點服務的查詢。

api.get('/users', function(req, res) { 
    // generate the query object based on URL parameters 
    var queryObject = {}; 
    for (var key in req.query) { 
     queryObject[key] = req.query[key]; 
    } 

    // find the users with the filter applied. 
    User.find(queryObject, cb); 
}; 

通過構建您的端點這種方式,你是以下一個RESTful API標準,這將使它很容易讓別人理解你的代碼和API。此外,您正在構建一個適應性API,因爲您現在可以通過將該字段作爲參數添加到URL來按任意字段過濾用戶。

有關何時使用路徑參數與URL參數的更多信息,請參閱this response

+0

REST對端點設計沒有任何說明。其餘部分+1,這是現貨。 –

+0

我在實現中看到的唯一問題是任何來自外部的人都能夠查詢數據庫並獲得內部結構的洞察。這是一個潛在的安全問題。 – Stefan

+0

您是否在顯示信息的響應中將用戶對象返回給客戶端?如果是的話,任何人都可以使用URL中的字段來查詢數據庫並不重要,因爲無論如何他們都能夠看到用戶結構。此外,您可以在後端進行一些檢查,以便現在允許在必要時查詢某些字段。 – Mike