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

ale*_*lex 6 c# urlencode url-encoding restsharp asp.net-web-api

我无法将数组(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} );
Run Code Online (Sandbox Code Playgroud)

我认为问题与参数的 UrlEncoding 有关

如果我使用“new int[] {1,2,3}”(AddParameter 和 AddQueryParameter)传递值,则 url 的构建方式如下:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=System.Int32[]}
Run Code Online (Sandbox Code Playgroud)

如果我将值作为字符串“[1,2,3]”(AddParameter 和 AddQueryParameter)传递,则 url 的构建方式如下:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=[1%2C2%2C3]}
Run Code Online (Sandbox Code Playgroud)

相反,工作网址应该是:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=%5B1,2,3%5D}
Run Code Online (Sandbox Code Playgroud)

或者至少:

ResponseUri = {https://demo.xxxxxxxx.com:8181/ws/messages/zippedMessages?messageIds=[1,2,3]}
Run Code Online (Sandbox Code Playgroud)

“AddParameter”方法对逗号进行编码,但不对 [ ] 进行编码,如果相反的话。

有办法改变这种行为吗?是否存在类似预执行事件之类的东西来替换字符?或者其他一些解决方法?

小智 3

我实现这一目标的方法是使用 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);
Run Code Online (Sandbox Code Playgroud)

此行将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