Backbone.js和Backbone实现的最佳URL结构

时间:2013-08-29 13:16:50

标签: javascript api rest url backbone.js

我正在为Quiz应用开发一个RESTful API,它将使用Backbone.js和Marionette构建。我对骨干很新,并且想知道最好的URL结构是什么。我有以下资源:

  • 答案,
  • 包含答案的问题,
  • 包含问题的问题组,
  • 包含问题组的测验。

我想到了两种可能的URL结构:

  • GET /quizzes/:id
  • GET /quizzes/:id/questiongroups
  • GET /quizzes/:id/questiongroups/:id
  • GET /quizzes/:id/questiongroups/:id/questions
  • GET /quizzes/:id/questiongroups/:id/questions/:id
  • GET /quizzes/:id/questiongroups/:id/questions/:id/answers

或:

  • GET /quizzes/:id
  • GET /quizzes/:id/questiongroups
  • GET /questiongroups/:id
  • GET /questiongroups/:id/questions
  • ...

现在,我一直在尝试使用这两个选项。对于第一个,我无法弄清楚如何将集合定义为Backbone中父模型的属性,以便我可以对它们使用fetch()。第二个选项的问题有点不同:据我所知,Backbone从其集合派生模型的url,但该集合是另一个资源的子集,而获取单个资源的url使用另一个集合,即全球资源。

我很确定在两种情况下我都必须覆盖url()。我尝试了一些东西,但没有提出任何可用的东西。此外,我宁愿不覆盖应用中的每一个url()模型,更改API结构以适应Backbone的偏好似乎对我来说是一个更好的选择。

关于使用Backbone做正确的方法的任何指示都会很棒!

由于

1 个答案:

答案 0 :(得分:0)

如果questiongroup只能出现在单个quiz中,那么第一个选项(分层选项)就是明显的选择。要遵守RESTful约定,您可能需要考虑使用单数名词:/quiz/:id/questiongroups/:id/question/:id/answer/:id

要解决您的提取问题,我建议您根据以下答案使用嵌套骨干模型:https://stackoverflow.com/a/9904874/1941552。我还添加了一个厚脸皮的小parentModel属性。

例如,您的QuizModel可能如下所示:

var Quiz = Backbone.Model.extend({

    urlRoot: '/quiz/',  // backbone appends the id automatically :)

    defaults: {
        title: 'My Quiz'
        description: 'A quiz containing some question groups.'
    },

    model: {
        questionGroups: QuestionGroups,
    },

    parse: function(response){
        for(var key in this.model){
            var embeddedClass = this.model[key];
            var embeddedData = response[key];
            response[key] = new embeddedClass(embeddedData, {
                parse:true, 
                parentModel:this
            });
        }
        return response;
    }
});

然后,您的QuestionGroups模型可能具有以下url()功能:

var QuestionGroups = Backbone.Model.extend({

    // store metadata and each individual question group

    url: function() {
        return this.parentModel.url()+'/questiongroup/'+this.id;
    }

});

或者,如果您不需要存储任何元数据,则可以使用Backbone.Collection

var QuestionGroups = Backbone.Collection.extend({

    model: QuestionGroup,

    url: function() {
        return this.parentModel.url()+'/questiongroup/'+this.id;
    }

});

我担心我没有测试任何这个,但我希望它无论如何都可以用!