如何从 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 数据的主要内容,如果未能解决你的问题,请参考以下文章

找不到如何使用 HttpContent

C#.NET Web API 2,如何使用 HTTPGET 异步方法上的 HttpContent 从网站中提取特定文本?

将 JSON HttpContent 发布到 ASP.NET Web API

将 HttpContent 转换为 byte[]

使用 StreamReader 读取 HttpContent 流直到字符限制

iOS 检索 Web 响应数据后如何从 JSON 中检索值