如何通过使用JQuery AJAX在GET请求中将数组作为查询字符串传递

时间:2018-08-29 09:18:45

标签: jquery arrays ajax serialization get

在我的Javascript应用程序中,我试图通过jQuery Ajax将GET请求中的字符串数组以及其他参数传递给ASP.NET Web API REST服务。 网址示例如下:

http://my.services.com/products?userId=1abc&id=1&id=2&id=3

Web API方法的签名:

[HttpGet("products")]
public IActionResult GetProducts(string userId, int[] id)

如果我尝试使用Postman进行请求,则参数绑定将正常工作。在Javascript应用程序中,我尝试了几种没有运气的解决方案。代码如下:

let data = {
  'userId': '1abc'
  'id': [1,2,3]
}

$.ajax({
   type: 'get',
   url: 'http://my.services.com/products',
   data: data,
   crossDomain: true, //CORS
   cache: false,
}

在这种情况下,URL变为:

http://my.services.com/products?userId=1abc&id%5B%5D=1&id%5B%5D=2&id%5B%5D=3

因为在解析结果中而不是使用id作为键,所以它使用了id[],因此将字符[]编码为%5B%5D。 / p>

即使我使用此代码也没有运气:

let data = {
  'userId': '1abc'
  'id': JSON.stringify([1,2,3])
}

或(如本answer所示)

let data = {
  'userId': '1abc'
  'id[]': [1,2,3]
}

请记住,对于其他调用,上面的代码JQuery AJAX代码可以正常工作。

1 个答案:

答案 0 :(得分:3)

请求的问题是因为默认的ASP.Net模型绑定器希望数组通过查询字符串作为单独的键/值对发送,如您的第一个示例URL所示。

要实现此目的,您只需要在jQuery traditional: true请求中设置$.ajax()

let data = {
  userId: '1abc'
  id: [ 1, 2, 3 ]
}

$.ajax({
  type: 'get',
  url: 'http://my.services.com/products',
  data: data,
  traditional: true
});

此外,请注意,在发出AJAX请求时请避免使用绝对URL,如果不按常规维护代码,则很容易遇到CORS问题。我建议尽可能使用相对路径。