RestSharp — массив как параметр строки запроса

я не могу передать массив (массив int) в качестве параметра строки запроса клиенту RestSharp

var client = new RestClient(baseUrl);
client.Authenticator = new HttpBasicAuthenticator(username, password);

var request = new RestRequest(_endpoint, Method.GET);
            request.AddHeader("cache-control", "no-cache");
            request.AddHeader("contenttype", "application/json; charset=utf-8");
            request.AddHeader("Accept", "text/html, application/xhtml+xml, image/jxr, */*");


//i tried with
request.AddParameter("messageIds", "[1,2,3]");
or
request.AddParameter("messageIds", new int[] {1,2,3} );
or
request.AddQueryParameter("messageIds", "[1,2,3]");
or
request.AddQueryParameter("messageIds", new int[] {1,2,3} );

я предполагаю, что проблема связана с UrlEncoding параметров

в случае, если я передаю значения с «новым int [] {1,2,3}» (как AddParameter, так и AddQueryParameter), URL-адрес строится следующим образом:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=System.Int32[]}

в случае, если я передаю значения в виде строки «[1,2,3]» (как AddParameter, так и AddQueryParameter), URL-адрес строится следующим образом:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=[1%2C2%2C3]}

вместо этого рабочий URL должен быть:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=%5B1,2,3%5D}

или по крайней мере:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=[1,2,3]}

метод «AddParameter» кодирует запятую, но не [ ] , если наоборот.

есть ли способ изменить это поведение? существует ли что-то вроде события PreExecute, где можно изменить символы? или какой-то другой обходной путь?


person alex    schedule 07.04.2017    source источник
comment
В реальном запросе он должен быть представлен как messageIds=a&messageIds=b&messageIds=c. Я не использовал клиент RESTSharp, но можно ли просто добавлять идентификаторы сообщений несколько раз?   -  person Llama    schedule 07.04.2017
comment
Возможный дубликат Передача списка int в веб-API из RestSharp Клиент   -  person Llama    schedule 07.04.2017
comment
Джон, это создает URL-адрес, как вы написали мне, и API, который я использую, достаточно глуп, чтобы не принимать параметры таким образом. К сожалению, я не могу изменить его.   -  person alex    schedule 07.04.2017
comment
Определили ли они формат, в котором они ожидают передачи массивов?   -  person Llama    schedule 07.04.2017
comment
пробуя эти форматы с почтальоном, API работает: demo.xxxxxxxx.com:8181/ws/messages/ demo.xxxxxxxx.com:8181/ws/messages/   -  person alex    schedule 07.04.2017
comment
Я просмотрел это и кажется, что принятый ответ правильный: RestSharp жестко закодировано, чтобы всегда кодировать параметры. Я не понимаю, как вы можете передать необходимую информацию в RestSharp. Может быть, кто-то лучше меня сможет :) Сомневаюсь, что это поможет, но к вашему сведению: источник RestSharp использовал Uri.EncodeDataString()   -  person Llama    schedule 07.04.2017


Ответы (2)


Я достиг этого, используя String.Join().

int[] messageIds = {1, 2, 3};
var request = new RestRequest(_endpoint, Method.GET);
var stringOfInts = String.Join(",", new List<int>(messageIds).ConvertAll(i => i.ToString()).ToArray());
request.AddQueryParameter("messageIds", stringOfInts);

Эта строка var stringOfInts = String.Join(",", new List<int>(messageIds).ConvertAll(i => i.ToString()).ToArray()); преобразует ваш массив int в список. Это позволяет нам использовать выражение linq в списке для преобразования каждого целого числа в списке в строку. Как только это будет сделано, он преобразует список обратно в массив, чтобы вы могли использовать для него string.Join(). Запятая является разделителем.

stringOfInts будет установлено значение «1,2,3», что означает, что вывод всего сегмента кода выше (в виде URL) будет {_endpoint}?messageIds=1,2,3

РЕДАКТИРОВАТЬ: Кредит относится к следующему сообщению: int array to string

person Jack Middleton    schedule 31.05.2018

Я немного опаздываю на вечеринку, но этого также можно добиться с помощью LINQ, и в моем случае я сделал следующее:

var request = new RestRequest("ServiceName", Method.GET);

var userIds = new List<int> { 123, 456};
     userIds.ForEach(x => request.AddParameter("userIds", x, ParameterType.GetOrPost));

Приведенный выше код генерирует URL-адрес, который добавляет ваш целочисленный список в качестве строки запроса в ваш запрос.

Your_Service_Name?userIds=123&userIds=456

надеюсь это поможет

person NSDumb    schedule 29.03.2019