【问题标题】:Request body could not be parsed无法解析请求正文
【发布时间】:2021-07-09 13:33:47
【问题描述】:

我一直在尝试解决以下错误,但我无法解决

下面是代码。

[HttpPost]
public async Task<JsonResult> BVNMatch_Testing(string BVN, string Acc_No, string bank_code, string firstname, string lastname)
{
    var secretKey = ConfigurationManager.AppSettings["paystack_SecretKey"];
    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.paystack.co/bvn/match"))
        {
            httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {secretKey}");
          
            request.Content = new StringContent("{ \"bvn\": "+ BVN + ",\n      \"account_number\": " + Acc_No + ",\n      \"bank_code\": " + bank_code + ",\n      \"first_name\": " + firstname + ",\n      \"last_name\": " + lastname + "\n  }");

            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

            var response = await httpClient.SendAsync(request);
            var jsonString = await response.Content.ReadAsStringAsync();
            BVNMatch myDeserializedClass = JsonConvert.DeserializeObject<BVNMatch>(jsonString);
            return Json(myDeserializedClass);
        }
    }
}

当我从前端调用 API 时它一直带来的错误是:

无法解析请求正文。确保请求正文匹配指定的内容类型:application/json

我错过了什么吗?

【问题讨论】:

  • 请不要手动构建 JSON 数据,而是使用 System.Text.Json 之类的东西来为您完成
  • 自昨天以来变化不大。我们可以重复我们给您的指导:不要通过执行字符串 concat 创建 json 有效负载。
  • 在上面代码中的哪一行你得到了那个错误?
  • @rene, request.Content = new StringContent("{ \"bvn\": "+ BVN + ",\n \"account_number\": " + Acc_No + ",\n \" bank_code\": " + bank_code + ",\n \"first_name\": " + firstname + ",\n \"last_name\": " + lastname + "\n }");
  • @rene,如果您能提供帮助,我在构建 JSOn 时遇到问题

标签: c# json asp.net-mvc


【解决方案1】:

(在 cmets 中会一团糟) 您可以使用 JsonConvert 和匿名类型来构建您的有效负载。即:

 var payload = new
{
    bvn = "BVN",
    account_number = "Acc_No",
    bank_code = "bank_code",
    first_name = "firstname",
    last_name = "lastname"
};

request.Content = new StringContent(JsonConvert.SerializeObject(payload));

(您将使用实际值)。 或者更好:

var postdata = JsonConvert.SerializeObject(payload);
using (StreamWriter sw = new StreamWriter(request.GetRequestStream()))
{
    sw.Write(postData);
    sw.Close();
}

【讨论】:

  • 谢谢你,但它一直突出显示行 request.Content = JsonConvert.SerializeObject(payload);错误是 CANNOT IMPLICITLY CONVERT TYPE STRING TO SYSTEM.NET.HTTP.HTTPCONTENT
  • @mantics request.Content = new StringContent(JsonConvert.SerializeObject(payload);
  • 查看 using(...)。
  • 您好,我使用前一种方法,但下面是 json 生成的内容。 "{\r\n \"BVN\": \"123456789\",\r\n \"account_number\": \"0689688574\",\r\n \"bank_code\": \"052\", \r\n \"first_name\": \"myname\",\r\n \"last_name\": \"mysurname\"\r\n}" 并且端点期望它采用这种格式 "{ \ "bvn\": \"123456789\",\n \"account_number\": \"0689688574\",\n \"bank_code\": \"052\",\n \"first_name\": \"我的名字\",\n \"姓氏\": \"我的姓氏\"\n }"
  • 所以有了上面的结果,它返回 BVN 是必需的
【解决方案2】:

好的,所以主要问题是您手动连接 JSON 数据,这相当很糟糕,因为它很容易出错(正如您现在正在弄清楚的那样)。

您问题中的实际问题是您连接 JSON 错误。将其打印到控制台会导致:

{ "bvn": BVN,
      "account_number": Acc_No,
      "bank_code": bank_code,
      "first_name": first_name,
      "last_name": lastname
  }

这不是有效的 JSON。 Here 是我的代码导致了这个。有效的 JSON 需要在任何不是整数、布尔值或对象的地方加上引号。

可以(但不应该)通过在所有变量之前添加转义的" 来修复它。就像\"bvn\": \"" + BVN + "\",\n",但看看这真的很难阅读吗? $"\"bvn\": \"{BVN}\"" 更好一点,但这仍然不好。相反,请使用内置的 System.Text.Json(如果您使用的是 .NET Core 3.1 或更高版本)或 Newtonsoft.Json(如果您使用的是 .NET Framework)。以下是使用 Newtonsoft.Json 的方法(因为您的问题是用 .NET Framework ASP.NET 标记的):

public class MatchPayload
{
    [JsonProperty("bvn")]
    public string Bvn {get; set;}

    [JsonProperty("account_number")]
    public string AccountNumber {get; set;}

    [JsonProperty("bank_code")]
    public string BankCode {get; set;}    

    [JsonProperty("first_name")]
    public string FirstName {get; set;}

    [JsonProperty("last_name")]
    public string LastName {get; set;}
}

[HttpPost]
public async Task<JsonResult> BVNMatch_Testing([FromBody] MatchPayload payload)
{
    var secretKey = ConfigurationManager.AppSettings["paystack_SecretKey"];
    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.paystack.co/bvn/match"))
        {
            httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {secretKey}");
          
            // See how easier and cleaner this is?
            request.Content = JsonConvert.SerializeObject(payload);
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/json");

            var response = await httpClient.SendAsync(request);
            var jsonString = await response.Content.ReadAsStringAsync();
            BVNMatch myDeserializedClass = JsonConvert.DeserializeObject<BVNMatch>(jsonString);
            return Json(myDeserializedClass);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2014-06-10
    • 1970-01-01
    • 2018-12-01
    • 2021-01-16
    • 1970-01-01
    • 2023-02-03
    • 2021-11-12
    • 2022-07-18
    • 2020-04-16
    相关资源
    最近更新 更多