Как передать массив в виде строки запроса в запросе GET с помощью JQuery AJAX - PullRequest
0 голосов
/ 29 августа 2018

В моем приложении javascript я пытаюсь передать массив строк, среди других параметров, в запросе GET службе REST ASP.NET Web API с помощью jQuery Ajax. Пример URL выглядит следующим образом:

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

Подпись метода Web API:

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

Если я попробую запрос с почтальоном, привязка параметров будет работать правильно. В приложении 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.

Не повезло, даже если я использую этот код:

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

или (как видно из этого ответа )

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

Имейте в виду, что для других вызовов приведенный выше код JQuery AJAX работает без каких-либо проблем.

1 Ответ

0 голосов
/ 29 августа 2018

Проблема с запросом заключается в том, что механизм связывания модели ASP.Net по умолчанию ожидает, что массивы будут отправляться через строку запроса в виде отдельных пар ключ / значение, как показано в первом примере URL.

Для этого вам просто нужно установить traditional: true в вашем jQuery $.ajax() запросе:

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

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

Кроме того, в качестве примечания, опасаясь использования абсолютных URL-адресов при выполнении запросов AJAX, вы можете легко столкнуться с проблемами CORS, если код не поддерживается на регулярной основе. Я бы посоветовал использовать относительные пути, где это возможно.

...