【问题标题】:Repeated deserializing and serializing when calling API - is there a better way?调用 API 时重复反序列化和序列化 - 有没有更好的方法?
【发布时间】:2018-01-09 01:57:11
【问题描述】:

我正在开发一个网站以及一个 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();
}

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

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

1) 它将 API 与网站的前端紧密耦合,目前我可以选择在网站中实现一个接口层以简化将来需要更换 API 的事情。

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

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

【问题讨论】:

  • 你会如何缩短这个?
  • 我不知道,我只是想看看有没有可能。

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


【解决方案1】:

你真正想解决什么问题?与网络 i/o 所花费的时间相比,序列化/反序列化 json 所花费的时间很小。

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

【讨论】:

  • 你可能是对的,这似乎是我认为的常见设计模式的一个奇怪方面。
【解决方案2】:

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

客户端实际上是为您提供 C# 对象以供您使用,因此它对请求/响应进行序列化/反序列化,以便您更轻松地使用 API。这就是重点。您的意思是您实际上并不想要这个,所以只需删除客户端即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    相关资源
    最近更新 更多