如何从 HttpContent 检索 JSON 数据
Posted
技术标签:
【中文标题】如何从 HttpContent 检索 JSON 数据【英文标题】:How to retrieve JSON data from HttpContent 【发布时间】:2021-07-17 20:19:57 【问题描述】:我正在构建一个控制台 Web API 来与本地主机服务器通信,为它们托管计算机游戏和高分。每次我运行我的代码时,我都会收到这个迷人的错误:
失败: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1] 执行请求时发生未处理的异常。
System.NotSupportedException:反序列化类型没有 无参数构造函数、单一参数化构造函数或 用“JsonConstructorAttribute”注释的参数化构造函数是 不支持。键入“System.Net.Http.HttpContent”。路径:$ | 行号:0 | BytePositionInLine:1。
这是我用来发布到数据库的方法。请注意,此方法不在控制台应用程序中。它在 ASP.NET Core MvC 应用程序中打开 Web 浏览器并侦听 HTTP 请求(可以来自控制台应用程序)。
[HttpPost]
public ActionResult CreateHighscore(HttpContent requestContent)
string jasonHs = requestContent.ReadAsStringAsync().Result;
HighscoreDto highscoreDto = JsonConvert.DeserializeObject<HighscoreDto>(jasonHs);
var highscore = new Highscore()
Player = highscoreDto.Player,
DayAchieved = highscoreDto.DayAchieved,
Score = highscoreDto.Score,
GameId = highscoreDto.GameId
;
context.Highscores.Add(highscore);
context.SaveChanges();
return NoContent();
我在一个纯 C# 控制台应用程序中发送 POST 请求,信息从用户输入中收集,但使用 Postman 发送请求时的结果完全相同 - 上述 NotSupportedException。 p>
private static void AddHighscore(Highscore highscore)
var jasonHighscore = JsonConvert.SerializeObject(highscore);
Uri uri = new Uri($"httpClient.BaseAddresshighscores");
HttpContent requestContent = new StringContent(jasonHighscore, Encoding.UTF8, "application/json");
var response = httpClient.PostAsync(uri, requestContent);
if (response.IsCompletedSuccessfully)
OutputManager.ShowMessageToUser("Highscore Created");
else
OutputManager.ShowMessageToUser("Something went wrong");
我对所有这些 HTTP 请求都是新手,所以如果您在我的代码中发现一些明显的错误,我们将不胜感激。不过,最重要的问题是,我缺少什么,以及如何从 HttpContent 对象中读取数据,以便能够创建一个 Highscore 对象以发送到数据库?
问题似乎是 string jasonHs... 行,因为当我注释掉 ActionResult 方法的其余部分时,应用程序以完全相同的方式崩溃。
【问题讨论】:
哪一行报错了?你检查过requestContent
吗?它实际上是否包含正确的 JSON?
我最后解释了,我认为是string jasonHs = requestContent.ReadAsStringAsync().Result;
,因为我注释掉了其他的。我确实在控制台应用程序中检查了 requestContent,并且 JSON 数据在那里。出于某种原因,我无法在 ASP.NET 解决方案中设置断点,它们不起作用或者我不知道自己在做什么!
无论如何,我最近从 Microsoft Docs 中看到了这篇文章,docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/… - 很快就会完成本教程。它可能包含一个解决方案,但至少看起来很有趣。
【参考方案1】:
根据您的代码,我们可以发现您使用 json 字符串数据(从 Highscore
对象序列化)从控制台客户端向 Web API 后端发出 HTTP Post 请求。
在您的操作方法中,您根据接收到的数据手动创建Highscore
的实例,那么为什么不让您的操作接受Highscore
类型参数,如下所示。然后model binding system 将帮助自动将数据绑定到操作参数。
[HttpPost]
public ActionResult CreateHighscore([FromBody]Highscore highscore)
//...
【讨论】:
最终在上面的 AddHighscore 方法中使用了 HttpResponseMessage,而不是 HttpContent。工作正常,没有得到异常,我在使用 HttpContent 时遇到了问题。以上是关于如何从 HttpContent 检索 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章
C#.NET Web API 2,如何使用 HTTPGET 异步方法上的 HttpContent 从网站中提取特定文本?
将 JSON HttpContent 发布到 ASP.NET Web API