首页 > 解决方案 > 使用参数发布到 api

问题描述

尝试调用 api :"https://api.postcodes.io/postcodes/" 是具有这种结构的后调用:

{
  "postcodes" : ["PR3 0SG", "M45 6GN", "EX165BL"]
}

创建邮政编码数组以及如何发送它们的最佳做法是什么?我的代码:

List<string> test = new List<string>();
test.Add("OX49 5NU");
test.Add("M32 0JG");
test.Add("NE30 1DP");

var requestString = string.Join(",", test.ToArray());

var queryParams = new Dictionary<string, string>()
{
    { "postcodes", requestString }
};

var s = queryParams.ToString();
var data = new StringContent(queryParams.ToString(), Encoding.UTF8, "application/json");
var uri = "https://api.postcodes.io/postcodes/";
var httpClient = new HttpClient();
var response = await httpClient.PostAsync(uri, data);

不工作。

亲切的问候/鲁迪

标签: c#jsonapi

解决方案


您根本不应该使用.ToString()并依赖 .Net 中可用的精彩 JSON 序列化。

    List<string> postcodes = new List<string>
    {
        "OX49 5NU",
        "M32 0JG",
        "NE30 1DP"
    };

    var json = System.Text.Json.JsonSerializer.Serialize(new { postcodes });
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    
    using var httpClient = new HttpClient();

    var uri = "https://api.postcodes.io/postcodes/";
    var response = await httpClient.PostAsync(uri, content);

new { postcodes }postcodes创建一个匿名类型,其名称为由邮政编码列表组成的单个属性。

还要注意usinghttpClient 上的。对于一个简单的示例,它可能无关紧要,但您至少应该正确处理 httpClient 。

更新
正如@marsze 指出的那样,通常最好使用,在需要时IHttpClientFactory调用this 将允许 .Net 汇集 HttpClients 可以在不消耗额外资源的情况下重复使用。这确实超出了问题/答案的范围。CreateClient()HttpClient


推荐阅读