无法将字符串列表传递到 Web API 端点。为什么?
Can not pass a list of strings to a Web API endpoint. Why?
无法将字符串列表传递到 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。
我不确定这里有什么问题。我检查了一些来源。例如。以下:
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);
也许有人知道为什么我的例子中的参数只从查询字符串中读取,而不是从正文中读取?
您可以在 client.PostAsync
中将 url 更改为完整的 url。这是一个演示:
Api(localhost: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);
}
结果:
无法将字符串列表传递到 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。
我不确定这里有什么问题。我检查了一些来源。例如。以下:
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);
也许有人知道为什么我的例子中的参数只从查询字符串中读取,而不是从正文中读取?
您可以在 client.PostAsync
中将 url 更改为完整的 url。这是一个演示:
Api(localhost: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);
}
结果: