使用 MVC 6 在 ASP.NET 5 中显示从 WebRequest 获取的 JSON 数据

Posted

技术标签:

【中文标题】使用 MVC 6 在 ASP.NET 5 中显示从 WebRequest 获取的 JSON 数据【英文标题】:Displaying JSON data acquired from a WebRequest in ASP.NET 5 using MVC 6 【发布时间】:2016-06-17 09:47:36 【问题描述】:

这是我的第一个问题,所以如果我弄乱了格式或总体上做错了,我深表歉意,请随时给我指点,我总是乐于学习。

无论如何,我手头的问题是我正在使用 ASP.NET 5 和 MVC 6 开发一个 Web 应用程序,所有这些都是最新的,到目前为止,为了进行测试,我一直在使用 localdb 并且正在工作用假数据。现在,我有一个带有 API 令牌和登录信息的 url,我正在使用 WebRequest 获取数据并使用 StreamReader 将其流式传输到变量中,写入它,然后尝试返回它。

WebRequest req = WebRequest.Create(@"https://url.fortheapi.com/api/search/things?criteria=" + userInput);
req.Method = "GET";
req.Headers["username"] = "user";
req.Headers["password"] = "password";
req.Headers["token"] = "token";

StreamReader responseReader = new StreamReader(req.GetResponse().GetResponseStream());
var responseData = responseReader.ReadToEnd();

Response.WriteAsync(responseData);

return View(responseData);

这是我卡住的地方,因为我不确定如何将它作为模型数据传递给视图,我目前没有模型,我想基于这个数据库制作一个并使用实体框架来处理就像我一直在 localdb 一样。如果有更好的方法,请随时提出。我会接受我现在能得到的所有帮助。

【问题讨论】:

将您的 json 粘贴到 json2csharp.com,您的模型将与它大致相同。 因此,当我从该 json 制作模型时,我是否只需使用上面和视图页面上的相同代码,调用该模型,并像使用 localdb 一样引用其中的数据? 【参考方案1】:

您需要创建 POCO 类来表示您从 api 调用中收到的数据。获得响应数据后,您可以简单地使用 javascript 序列化来反序列化对 POCO 类对象的响应。您可以将其传递给您的视图。

public async Task<ActionResult> Contact()

    var req = WebRequest.Create(@"yourApiEndpointUrlHere");    
    var r = await req.GetResponseAsync().ConfigureAwait(false);              

    var responseReader = new StreamReader(r.GetResponseStream());
    var responseData = await responseReader.ReadToEndAsync();

    var d = Newtonsoft.Json.JsonConvert.DeserializeObject<MyData>(responseData);    
    return View(d);

假设你的 api 像这样返回 json 数据

   "Code": "Test", "Name": "TestName" 

并且您创建了一个名为MyData 的 POCO 类,可用于表示从 api 返回的数据。您可以使用 json2csharp 从您从您的 api 收到的 json 响应生成您的 C# 类。

public class MyData

   public string Code  get; set; 
   public string Name  set;get;
   //Add other properties as needed

现在你的视图应该被强类型化到这个 POCO 类

@model MyData
<h2>@Model.Code</h2>
<h2>@Model.Name</h2>

【讨论】:

感谢您的回复,我会研究并尝试应用它,非常感谢您的时间和精力! 那么对于序列化,我必须使用这种特定类型的函数还是可以在常规 IActionResult 控制器函数中使用它?我正在从表单中获取搜索条件,并且已经在该函数中收集了所有用户数据,我只想插入该数据并获取我请求的数据。 是的,您可以在控制器操作中执行此操作。【参考方案2】:

如果您收到的是 JSON,您可以通过多种方式完成此操作。

一种方法是将您发布的代码包装到 JSON 结果类型的操作中。下面是一个非常简单的例子:

    [HttpPost]
    public JsonResult GetIncidentId(int customerId, string incidentNumber)
    
        JsonResult jsonResult = null;
        Incident incident = null;

        try
        
            incident = dal.GetIncident(customerId, incidentNumber);
            if (incident != null)
                jsonResult = Json(new  id = incident.Id );
            else
                jsonResult = Json(new  id = -1 );

        
        catch (Exception exception)
        
            exception.Log();
        

        return jsonResult;
    

通过 Javascript 从视图中调用它并手动填充您的表单 (meh)。

或者更优雅地,您可以创建一个 MVC 模型来保存您收到的数据并将 JSON 序列化到该模型中。下面是一个例子:

发件人:http://www.newtonsoft.com/json/help/html/deserializeobject.htm

public class Account

    public string Email  get; set; 
    public bool Active  get; set; 
    public DateTime CreatedDate  get; set; 
    public IList<string> Roles  get; set; 


string json = @"
  'Email': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
";

Account account = JsonConvert.DeserializeObject<Account>(json);

希望这对您的应用有所帮助并祝您好运!

【讨论】:

如果我使用您给我的第二段代码,我是否可以将其视为“代码优先”数据库模型?我是否能够在视图中正常使用获取数据是我的意思。我目前正在为其制作模型,我将测试您的代码,感谢您的回复! 是的,没错。您将能够将结果用作本机视图模型。如果您发现自己不得不将数据传输到不同的模型,我真的很喜欢 AutoMapper 库,它可以节省语法。 HTH。 实际上,asp.net 5 似乎不再支持 JavaScriptSerializer。它的依赖项多年来没有更新,显然他们现在正在使用 Newtonsoft.Json,这是我正在研究的一个包。 当然,是的,我完全忘记了,抱歉。我认为 asp.net 团队切换到了 mvc4。 确实,如果你的数据是一个无标题的json集合,最好有一个包装类来保存它。

以上是关于使用 MVC 6 在 ASP.NET 5 中显示从 WebRequest 获取的 JSON 数据的主要内容,如果未能解决你的问题,请参考以下文章

将 asp.net 5 MVC 6 与 Identity 和 EF 6 一起使用的示例

如何在 Asp.Net 5 (MVC 6) 中使用实体框架 6.x

在 ASP.NET 5 (vNext) MVC 6 中实现自定义路由器

使用 ASP.NET 5 MVC 6 Web API 进行 Cookie 身份验证

如何使用 mvc 6、asp.net 5 注册全局过滤器

在 IIS 上使用 .NET Core 运行 ASP.NET 5 (MVC 6)