RestSharp - 数组作为查询字符串参数

时间:2017-04-07 07:23:21

标签: c# asp.net-web-api urlencode restsharp url-encoding

我无法将数组(一个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相关

如果我使用" new 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]}

应该是一个工作网址:

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事件的地方重新空格字符?或其他一些解决方法?

2 个答案:

答案 0 :(得分:1)

我实现这一点的方法是使用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将设置为&#34; 1,2,3&#34;这意味着上面整个代码段的输出(作为URL)将是{_endpoint}?messageIds=1,2,3

编辑: 积分转到以下帖子: int array to string

答案 1 :(得分:0)

聚会晚了一点,但是也可以通过使用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,该URL将整数列表作为查询字符串添加到您的请求中

Your_Service_Name?userIds=123&userIds=456

希望这会有所帮助