【问题标题】:Best way to pass List in query string HttpClient.GetAsync()在查询字符串 HttpClient.GetAsync() 中传递 List 的最佳方式
【发布时间】:2014-05-08 16:04:01
【问题描述】:

我使用HttpClient.GetAsync() 方法。我有一个类别列表,想在查询字符串中传递它。

 var categories = new List<int>() {1,2};

如何在查询字符串中传递List&lt;int&gt;/List&lt;string&gt;? 例如,https://example.com/api?categories=1,2

当然可以使用foreachStringBuilder。但也许有更好的方法来做到这一点?

例如,使用 .PostAsync() 和 json 内容非常方便:

var categories = new List<int>() {1,2}; //init List
var parametrs = new Dictionary<string, object>();
parametrs.Add("categories", categories); 
string jsonParams = JsonConvert.SerializeObject(parametrs); // {"categories":[1,2]}
HttpContent content = new StringContent(jsonParams, Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(new Uri("https://example.com"), content);        

附:我使用的是 Windows Phone 8。

【问题讨论】:

  • 您的代码显示您已经在使用 JSON 来传递内容。为什么不将查询字符串中的列表也作为 JSON 传递?毕竟,JSON 是在字符串中表示数据的好方法。不久前我问过if there'd be problems passing JSON in the URL,结果令人鼓舞。
  • 不用循环和StringBuilder,只需使用string.Join(",", categories)
  • @mason 如何使用 GetAsync() 在查询字符串中传递 json?抱歉,我不太明白。
  • @JeppeStigNielsen 感谢您的建议

标签: c# .net windows-phone-8 dotnet-httpclient


【解决方案1】:

如果您准备依赖支持 URI 模板的库,例如我创建的库 (http://www.nuget.org/packages/Tavis.UriTemplates/),那么您将获得创建 URI 的各种灵活性。完整的规范在这里RFC6570

您首先创建一个 URI 模板,

var template = new UriTemplate("http://example.com/api{?categories}");

您可以使用简单字符串、字符串列表或字符串键/值对字典来设置参数。

 var idList = new string[] {"1", "4", "5", "7", "8"};
 template.SetParameter("id",idList);

然后您可以解析参数以创建完整的 URI

  var uri = template.Resolve();
  Debug.Assert(uri == "http://example.com/api?categories=1,4,5,7,8");

好消息是,如果您有其他查询参数,或者有需要编码的字符,URI 模板处理器也会为您处理所有这些。

This 扩展测试套件让您了解一些受支持的疯狂内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 2012-04-24
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多