如何使用骨干设计REST搜索

use*_*729 15 rest backbone.js

我正在设计一个API,并使用Backbone.js来使用它.API的一部分将包括搜索操作.例如,在搜索汽车时,我可能会遇到以下情况:

http://api.mysite.com/search/cars?q=volvo
Run Code Online (Sandbox Code Playgroud)

有了骨干,我可以看到两种消费结果的选择.

选项1:搜索是集合

var CarSearch = Backbone.Collection.extend({
    model: Car,
    initialize : function(models, options){
        this.query = options.query;
    },
    url: function(){
        return "http://api.mysite.com/search/cars?q="+this.query;
    }
});

var volvos = new CarSearch([], {query:'volvo'});
volvos.fetch();
Run Code Online (Sandbox Code Playgroud)

选项2:搜索是模型,结果是集合

var CarSearchResults = Backbone.Collection.extend({
    model: Car
});

var CarSearch = Backbone.Model.extend({
    defaults: {
        "query":"",
        "carSearchResults":null
    },
    url: function(){
        return "http://api.mysite.com/search/cars?q="+this.get('query');
    },
    parse: function(resp,xhr){
        resp.carSearchResults = new CarSearchResults(resp.carSearchResults);
        return resp;
    }
});

var volvoSearch = new CarSearch();
volvoSearch.set({query:'volvo'});
volvoSearch.save();
Run Code Online (Sandbox Code Playgroud)

这些选项有哪些优点/缺点?有没有骨干式的设计方法?

我倾向于选项2,因为似乎更容易在响应中添加内容,如分页细节或下一个URL.但是选项2在某些方面看起来更加混乱.例如,在保存时,我会在服务器上为搜索模型生成一个ID吗?不要以为我需要通过ID获取该模型,删除或更新它并不是真的有意义,因为我没有坚持它.

Mos*_*eed 10

我不知道它是不是一个好习惯,但我用"搜索"方法中的"数据"选项.

/sf/answers/466165101/

也许有帮助.祝好运!

编辑

这是在集合url中传递查询参数的正确方法.对 Docs的引用显示了如何在fetch选项中传递data属性,data属性实际上是一个对象,其中键值对引用查询参数及其值

  • 这实际上是正确的答案. (3认同)

小智 5

我会选择一个.至少一个模型应该对应于单个搜索结果和对整个搜索结果集合的集合.因此,如果您搜索volvo并且返回了6个项目,则每个项目应该是您的集合中包含的模型.

现在,这在很大程度上取决于您在服务器上表示结果的方式.例如,如果您有汽车实例,那么您只需使用查询执行搜索服务器端并将结果对象作为json返回.然后,您可以将返回的列表设置为符合条件的汽车模型集合.但如果您打算以其他方式返回查询结果,那么您将不得不考虑模型应如何表示数据