无法解析请求正文

Posted

技术标签:

【中文标题】无法解析请求正文【英文标题】: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 时遇到问题 【参考方案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);
        
    

【讨论】:

以上是关于无法解析请求正文的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 错误:当 url 参数包含 JSON 数组时,“无法将请求正文解析为 json”

Node.js POST API 和请求正文的解析

改造无法正确解析正文

Tomcat 无法解析POST请求的参数

如何解析请求正文?

无法使用请求解析网页的确切结果