Url Backbone.js使用fetch和data填充集合--如何传递重复键?

Url Backbone.js使用fetch和data填充集合--如何传递重复键?,url,backbone.js,encoding,query-string,flask,Url,Backbone.js,Encoding,Query String,Flask,我的应用程序中有一个端点,它根据给定的查询字符串返回数据。查询字符串可以(通常必须)包含重复的键,例如/api/entities/related?filter1=val1&filter1=val2&filter2=val3,以标识类型为filter1的两个过滤器。Flask很好地处理了这个问题,例如在执行request.args.to dict时,我会得到{'filter1':['val1','val2'],'filter2':'val3'} 我的问题是,当从端点获取集合时,如何使用主干实现相同

我的应用程序中有一个端点,它根据给定的查询字符串返回数据。查询字符串可以(通常必须)包含重复的键,例如
/api/entities/related?filter1=val1&filter1=val2&filter2=val3
,以标识类型为
filter1
的两个过滤器。Flask很好地处理了这个问题,例如在执行
request.args.to dict
时,我会得到
{'filter1':['val1','val2'],'filter2':'val3'}

我的问题是,当从端点获取集合时,如何使用主干实现相同的功能。目前我可能有

this.fetch({data: {'filter1': 'val1', 'filter1': 'val2', 'filter2': 'val3'}});
由于重复的键将在javascript对象中相互覆盖,因此我的
filter1
值最终将成为
val2
。但是,什么时候,

this.fetch({data: {'filter1': ['val1', 'val2'], 'filter2': 'val3'}});
url最后是
/api/entities/related?filter1%5B%5D=val1&filter1%5B%5D=val2
,它至少使用了两个相同的键,但显然不起作用


这是一个编码问题还是我应该以不同的方式处理它?

您可以使用
数组作为值传递具有重复键的查询字符串

this.fetch({ data: $.param({ filter1: ['value1','value2']}) });
或者,您也可以使用querystring参数像这样设置URL

var MyModel = Backbone.Model.extend({
  "url": function() {
      return '/' + encodeURI('?filter1=' + val1 + '&filter1=' + val2);
  }
});
如果您必须始终更改参数,可以执行以下操作并直接使用:

this.model.destroy({
    url: '/' + encodeURI('?filter1=' + val1 + '&filter1=' + val2)              
});
如果您有多个具体的参数(意味着值会发生变化,但键是静态的),并且每次获取(即:search)都会发生变化,那么您可以检查一个分页实现,该实现可能对您的情况非常有用,不管它是什么


希望这能有所帮助。

谢谢大家的意见


显然,您传递的数据不必是对象——我发现在我的例子中,最简单的方法是传递一个字符串(
'filter1=val1&filter2=val2'
)到fetch(),它工作得很好。

您应该使用json有效负载与端点通信,即在必要时使用带有json主体的POST请求,与其处理查询字符串中混乱的url编码,不如越简单越好。我相信这是对url中的数组进行编码的标准方法,它可以解码回:
decodeURIComponent($.param({filter1:['val1',val2']}));//输出:“filter1[]=val1&filter1[]=val2”
。我找不到太多关于这方面的文档,但这一响应与此一致(另外,我相信jQuery的$.param()):谢谢--我确实尝试过使用$.param(),但仍然会产生相同的奇怪url。您的第二个建议是我最初所做的,但我不得不偶尔使用不同的参数重新提取数据,每次更新url没有意义。更改并测试了上面的第一个代码,以便为1个键传递多个值。查看我更新的响应。您的服务器框架应该(反)序列化类似于?filter[]=a&filter[]=b的内容到字典/哈希中,其中'filter'作为键,['a','b']作为值。这可能取决于服务器框架的语法。我提供的示例适用于Rails