2015-04-29 71 views
2

首先,我是web框架的新手。我們正在使用流星。 我有一個學生集合:設計一個休息API

Students = new Mongo.Collection('students'); 

目前,我們正在定義一個REST API爲:

// Maps to: /api/getAllStudents 
Restivus.addRoute('getAllStudents', {authRequired: false}, { 
    get: function() { 
     var students = Students.find().fetch(); 
     if (students.length > 0) { 
      return {status: 'success',count:students.length,data: students}; 
     } 
     else { 
     return { 
      statusCode: 404, 
      body: {status: 'fail', message: 'Students not found'} 
     }; 
    }} 
}); 
}; 

現在,可以有另一個API getStudentByName作爲

// Maps to: /api/getStudentByName by name 
Restivus.addRoute('getStudentByName', {authRequired: false}, { 
    get: function() { 
     var obj = {}; 
     for(var key in this.queryParams){ 
      var val = this.queryParams[key]; 
      obj[key] = val; 
     } 
     var students = Students.find(obj).fetch(); 
     if (student.length > 0) { 
      return {status: 'success',count: students.length, data: students}; 
     } 
     return { 
      statusCode: 404, 
      body: {status: 'fail', message: 'Students not found'} 
     }; 
    } 
}); 

目前我訪問它們爲

http://localhost:3000/api/getAllStudents 

http://localhost:3000/api/getStudentByName?name='abc' 

我會有更多這樣的API的學生(GET,PUT,POST,刪除)。另外,我還有更多的資源,比如老師,課程等等。每個資源都會定義一組API。現在,我想以一種整潔的方式來設計我的API(我知道這非常模糊和無組織)。我想最終調用它們作爲

http://localhost:3000/api/Students/getAllStudentshttp://localhost:3000/api/Students/getStudentByName?name='abc'

現在,我有一個學生,api.js,我已經把這些2 API和類 - api.js和老師,api.js包含自己各自的API。但是,這太沒有結構了。 是否可以使用「名稱」這樣的命名空間? 任何幫助真的很受歡迎..

回答

5

一個REST API不應該包含動詞。該動詞由HTTP提供。

// All Students 
GET http://localhost:3000/api/students 

一種可能的方式是提供一種過濾器PARAM

// Students named Mark 
GET http://localhost:3000/api/students?filter=name%3DMark 

// Teachers whose last name is Johnson 
GET http://localhost:3000/api/students?filter=lastName%3DJohnson 

這是使用一個統一的接口的REST API的美感。現在所有的API調用都可以支持相同的過濾器參數。

以下是在單個字段上進行相等匹配的簡單示例,因爲我沒有對其進行測試,所以可能需要對其進行調整。您可以通過支持多個字段和不同的操作員來改進它,使過濾變得更加智能。

var filterableCollections = ['students', 'teachers']; 
filterableCollections.forEach(function(collectionName) { 
    var Collection = new Mongo.Collection(collectionName); 
    Restivus.addRoute(collectionName, {authRequired: false}, { 
     get: function() { 
      var items; 
      var filter = this.queryParams.filter; 
      if (filter) { 
       var fieldNameValue = filter.split('='); 
       var queryObj = {}; 
       queryObj[fieldNameValue[0]] = fieldNameValue[1]; 
       items = Collection.find(queryObj).fetch(); 
      } else { 
       items = Collection.find().fetch(); 
      } 

      var response; 
      if (items.length > 0) { 
       response = {status: 'success', count: items.length, data: items}; 
      } else { 
       response = { 
        statusCode: 404, 
        body: {status: 'fail', message: collectionName + ' not found'} 
       }; 
      } 
      return response; 
     } 
    }); 
}); 

注:%3D=

+0

但隨後的URL編碼,怎麼會爲同一代碼寫?是否有一些特定的設計模式需要遵循?或任何具體的參考資料,可以幫助我達到相同的目的。 –

+0

這是一個很好的答案!我打算儘快在Restivus中提供這種支持(它不會在0.7.0發佈之後)。我希望你不介意我是否使用這段代碼作爲參考。 – kahmali

+0

剛剛提交了一個問題,以防您或其他人想在Restivus中討論對此的支持:https://github.com/kahmali/meteor-restivus/issues/70。如所承諾的,我在此使用您的代碼作爲參考。只是一個頭。 – kahmali