无法解析请求正文
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 @manticsrequest.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);
【讨论】:
以上是关于无法解析请求正文的主要内容,如果未能解决你的问题,请参考以下文章