【问题标题】:Can not pass a list of strings to a Web API endpoint. Why?无法将字符串列表传递给 Web API 端点。为什么?
【发布时间】:2020-09-15 20:24:41
【问题描述】:

无法将字符串列表传递给 Web API 端点。为什么?

这是我的控制器:

[Route("[controller]")]
[ApiController]
public class MyController
{
    [HttpPost("foo")]
    public string MyMethod(List<string> strs)
    {
        return "foo";
    }
}

这就是我试图称呼它的方式:

var strs = new List<string> { "bar" };
var json = JsonConvert.SerializeObject(strs);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await httpCliet.PostAsync("/My/foo", content);

在调用端点之前,我在return "foo"; 行上放置了一个断点。一旦断点被​​击中,MyController.MyMethod 内的strs 列表为空。 strs 不为空,但它不包含任何元素。虽然我的意图和期望是看到 strs 包含一个元素,即字符串 "bar"

我在创建和使用 HttpClient 的项目中使用 ASP.NET Core 2.2。我在有端点的项目中使用相同的 ASP.NET Core 2.2。

我不确定这里有什么问题。我检查了一些来源。例如。以下:

C# HTTP post , how to post with List<XX> parameter?

https://carldesouza.com/httpclient-getasync-postasync-sendasync-c/

https://blog.jayway.com/2012/03/13/httpclient-makes-get-and-post-very-simple/

根据这些资源,我找不到我缺少的东西。

更新

以下电话按预期对我有用:

var json = JsonConvert.SerializeObject(string.Empty);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await server.CreateClient().PostAsync("/My/foo?strs=bar", content);

也许有人知道为什么我的例子中的参数只从查询字符串中读取,而不是从正文中读取?

【问题讨论】:

  • 使用你的代码,我似乎在api中得到了调用,所以可能是你的机器?
  • 我不确定。不过谢谢。 :)

标签: list asp.net-core post parameters httpclient


【解决方案1】:

您可以在client.PostAsync 中将您的网址更改为完整网址。这是一个演示:

API(本地主机:44379):

天气预报控制器:

[HttpPost("foo")]
        public string MyMethod(List<string> strs)
        {
            return "foo";
        }

呼叫(本地主机:44326):

public async Task<IActionResult> CheckAsync() {
            HttpClient client = new HttpClient();
            var strs = new List<string> { "bar","bar1","bar2" };
            var json = JsonConvert.SerializeObject(strs);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            var response = await client.PostAsync("https://localhost:44379/WeatherForecast/foo", content);
            return Ok(response);
        }

结果:

【讨论】:

  • 谢谢。我会检查一些事情,然后再接受您的回答。
  • 我已经更新了我的问题。请检查一下好吗?
  • 也许更新的详细信息对您来说意义重大。因为对我来说这真的很混乱。 :)
  • 我无法解决我的问题。但我会接受你的回答。因为,这个问题似乎对我的环境非常特殊。因此,外部帮助似乎不是一个可行的机会。谢谢你,祝你有美好的一天。
猜你喜欢
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-04
  • 2021-05-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多