【问题标题】:WebApi HttpPost not receiving the posted content from HttpClientWebApi HttpPost 未从 HttpClient 接收发布的内容
【发布时间】:2020-10-26 13:34:05
【问题描述】:

网络 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
                    }
                }

【问题讨论】:

  • 远射:也许你需要API_URL + "/AuthenticateUser" 作为 URL?
  • 没有 API_URL 已经有正确的 URI 位置。调试时断点确实在 webapi 中命中..
  • 您正在从客户端以 JSON 格式发布结构化数据。那么为什么 API 只是试图接受一个纯字符串呢?这没有多大意义。让它接受具有正确结构的模型对象。 ASP.NET 将负责将 JSON 属性绑定到模型属性。
  • 你不应该有([FromBody] YourModel content)吗?其中YourModel 是具有要从您发布的json 反序列化的相关属性的类。
  • 另外,postParameters 应该只是 postParameters = new { Email = .., Password = .. };

标签: c# json asp.net-core asp.net-core-webapi dotnet-httpclient


【解决方案1】:

您正在从客户端以 JSON 格式发布结构化数据。那么为什么 API 只是试图接受一个纯字符串呢?这没有多大意义。

您应该让它接受具有正确结构的模型对象。 ASP.NET 将负责将 JSON 属性绑定到模型属性。但是,您还应该简化客户端中的 postParameters - 您使结构过于复杂。

例如

客户:

var postParameters  = new { Email = "abc@example.com", Password = "xyz" };

服务器:

public async Task<ActionResult<MAUser>> PostAsync([FromBody] UserCredentials credentials)
{
}

UserCredentials 是这样的 DTO 类:

public class UserCredentials
{
  public string Email { get; set; }
  public string Password { get; set; }
}

【讨论】:

  • 我的 DTO 类 UserCredentials 是否可以有两个以上的属性,即使我只提出两个参数?我已经有一个像“MAUser”这样的 DTO 对象,它在该类中有 Email、Passowrd 和其他属性。
  • 如果 TLS 失败,你永远不会得到响应,这意味着没有 json !!!并且没有 ActionResult
  • 没有 TLS 失败,因为我在 webapi 中的“PostAsync”处遇到断点
  • @WinFXGuy _"我的 DTO 类 UserCredentials 是否可以有两个以上的属性,即使我只提出两个参数?" ...是的,一点没错。模型绑定器将简单地忽略 JSON 中未包含的任何属性,并绑定提供的属性。
【解决方案2】:

好的,所以当使用内容类型时,您基本上是在告诉接收 API 如何解析请求负载,因此通过告诉它 application/json 框架正在尝试将负载从 JSON 解析到对象并将其分配给您的参数(不是真的,因为你需要添加一个属性 [FromBody] )但它不能这样做,因为你期待一个字符串,所以要么改变你的内容类型或改变你的参数类型(我建议你的参数类型)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多