调用API时重复反序列化和序列化 - 有更好的方法吗?

时间:2018-01-08 11:54:02

标签: c# ajax serialization asp.net-core

我正在开发一个网站以及一个用于提供数据的API,并注意到当前进程涉及在进行API调用时重复序列化和反序列化相同的数据。我想知道是否有更好的方法可以解决问题。网站和API都是使用ASP.Net Core 2.0在C#中编写的。

我目前的流程如下:

1)最终用户加载网站页面

2)AJAX调用是从客户端JavaScript调用的,在网站中调用C#函数。

3)C#网站函数调用API(使用Swagger生成的客户端)。

4)API序列化数据并将其作为JSON返回给网站。

5)网站中的Swagger客户端将数据反序列化为POCO类。

6)网站C#函数将数据序列化回JSON以将其返回给AJAX函数。

7)客户端中的JSON数据已完成 - 在首次解析JSON之后不可避免。

示例代码:

AJAX电话:

var xhr = new XMLHttpRequest();
xhr.open('get', "/GetData", true);
xhr.onload = function () {
    var data = JSON.parse(xhr.responseText);
    doSomething(data);
    }.bind(this);
xhr.send();

网站方法:

[Route("/GetData")]
public async Task<IActionResult> GetData()
{
    var data = await ApiClient.ApiDataGetAsync();
    return Json(data);
}

API方法:

[HttpGet]
public Dictionary<int, string> GetData()
{
    return _logic.GetData();
}

如上所示,数据在被Swagger客户端反序列化为POCO之前由API序列化为JSON,然后序列化回网站中的JSON以进行客户端处理。

我意识到我可以通过直接从AJAX调用API而不是通过网站来简化这一点,但我宁愿避免这种情况有很多原因:

1)它会将API紧密地耦合到网站的前端,目前我可以选择在网站中实现接口层,以便在将来需要更换API时简化操作。

2)它会减少我对谁可以访问API的控制 - 此时它被IP地址锁定。

有没有办法可以改进这个过程,以便在保留Swagger客户端的同时不必对数据进行两次序列化?

2 个答案:

答案 0 :(得分:1)

好吧,您可以放弃客户端,只需使用HttpClient从API获取代理即可将您的操作设为代理。

客户端旨在实际为您提供C#对象,因此它会对请求/响应进行序列化/反序列化,以便您更轻松地使用API​​。这就是重点。您所说的是您实际上并不想要这样,所以只需放弃客户端。

相反,您可以使用HttpClient从操作直接向您的API发出请求,然后只需返回HttpClient调用的响应即可。由于API返回JSON并且您需要JSON,因此无需进行进一步处理。

答案 1 :(得分:1)

你实际上试图解决什么问题?与网络化i / o所用的时间相比,序列化/反序列化json所需的时间很短。

此时我会说你正在尝试优化某些东西而不知道它是否会提高应用程序性能或降低成本,这通常被认为是浪费时间。