WebApi HttpPost 没有收到来自 HttpClient 的发布内容
WebApi HttpPost not receiving the posted content from HttpClient
网络API:
我也尝试在字符串 stringcontent 之前使用 [FormBody] 和 [FromForm]。
// POST api/<MAUserController>
[HttpPost("AuthenticateUser")]
public async Task<ActionResult<MAUser>> PostAsync(string stringcontent)
{
//stringcontent is null
}
客户代码:
List<KeyValuePair<string, string>> postParameters = new List<KeyValuePair<string, string>>();
postParameters.Add(new KeyValuePair<string, string>("Email", Email));
postParameters.Add(new KeyValuePair<string, string>("Password", Password));
var jsonString = JsonConvert.SerializeObject(postParameters);
var stringContent = new StringContent(jsonString, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenString);
//httpClient.DefaultRequestHeaders.Add("Email", Email);
//httpClient.DefaultRequestHeaders.Add("Password", Password);
using (var response = await httpClient.PostAsync(API_URL, stringContent))
{
if (response.IsSuccessStatusCode)
{
//Success code
}
else
{
//Handle unsuccessful here
}
}
您正在从客户端发布 JSON 格式的结构化数据。那么为什么 API 只是试图接受一个纯字符串呢?这没有多大意义。
您应该让它接受具有正确结构的模型对象。 ASP.NET 将负责将 JSON 属性绑定到模型属性。但是,您还应该在客户端中简化 postParameters
- 您是 over-complicating 结构。
例如
客户:
var postParameters = new { Email = "abc@example.com", Password = "xyz" };
服务器:
public async Task<ActionResult<MAUser>> PostAsync([FromBody] UserCredentials credentials)
{
}
其中 UserCredentials
是 DTO class,如下所示:
public class UserCredentials
{
public string Email { get; set; }
public string Password { get; set; }
}
好的,所以当使用内容类型时,您基本上是在告诉接收方 API 如何解析请求负载,因此通过告诉它 application/json 框架正在尝试解析来自 [=14] 的负载=] 到一个对象并将其分配给您的参数(不是真的,因为您需要添加一个属性 [FromBody] )但它不能这样做,因为您需要一个字符串,所以要么更改您的内容类型,要么更改您的参数类型(我会建议您的参数类型 ) .
网络API: 我也尝试在字符串 stringcontent 之前使用 [FormBody] 和 [FromForm]。
// POST api/<MAUserController>
[HttpPost("AuthenticateUser")]
public async Task<ActionResult<MAUser>> PostAsync(string stringcontent)
{
//stringcontent is null
}
客户代码:
List<KeyValuePair<string, string>> postParameters = new List<KeyValuePair<string, string>>();
postParameters.Add(new KeyValuePair<string, string>("Email", Email));
postParameters.Add(new KeyValuePair<string, string>("Password", Password));
var jsonString = JsonConvert.SerializeObject(postParameters);
var stringContent = new StringContent(jsonString, Encoding.UTF8, "application/json");
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", tokenString);
//httpClient.DefaultRequestHeaders.Add("Email", Email);
//httpClient.DefaultRequestHeaders.Add("Password", Password);
using (var response = await httpClient.PostAsync(API_URL, stringContent))
{
if (response.IsSuccessStatusCode)
{
//Success code
}
else
{
//Handle unsuccessful here
}
}
您正在从客户端发布 JSON 格式的结构化数据。那么为什么 API 只是试图接受一个纯字符串呢?这没有多大意义。
您应该让它接受具有正确结构的模型对象。 ASP.NET 将负责将 JSON 属性绑定到模型属性。但是,您还应该在客户端中简化 postParameters
- 您是 over-complicating 结构。
例如
客户:
var postParameters = new { Email = "abc@example.com", Password = "xyz" };
服务器:
public async Task<ActionResult<MAUser>> PostAsync([FromBody] UserCredentials credentials)
{
}
其中 UserCredentials
是 DTO class,如下所示:
public class UserCredentials
{
public string Email { get; set; }
public string Password { get; set; }
}
好的,所以当使用内容类型时,您基本上是在告诉接收方 API 如何解析请求负载,因此通过告诉它 application/json 框架正在尝试解析来自 [=14] 的负载=] 到一个对象并将其分配给您的参数(不是真的,因为您需要添加一个属性 [FromBody] )但它不能这样做,因为您需要一个字符串,所以要么更改您的内容类型,要么更改您的参数类型(我会建议您的参数类型 ) .