您当前的位置: 首页 >  http

寒冰屋

暂无认证

  • 2浏览

    0关注

    2286博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

设计一个通用的Http Rest Client包装器

寒冰屋 发布时间:2021-07-08 22:04:43 ,浏览量:2

在使用面向服务的架构时,客户端应用程序与多个微服务交互。REST API是当今最常用的服务,并且有多个Nuget包可用于通过HTTP使用此类远程资源。每个Web API都需要其特定的身份验证、默认标头、JSON格式化程序,此外,还需要将输出反序列化到您的应用程序模型。使用微服务架构,这些步骤会重复多次。因此需要围绕其余客户端创建包装器设计以避免代码重复。

介绍

设计生产就绪的应用程序需要删除代码冗余。在当今SOA和微服务占据主导地位的世界中,几乎每个应用程序都需要与服务进行交互,目前,重点是REST Web API服务。在微服务架构中,应用逻辑被拆分成多个服务,可以独立托管,使其具有可扩展性,并为产品开发带来敏捷性。每个服务都有其不同的基本URL、适用的默认标头、可接受的数据格式(JSON或XML)。

因此,在设计客户端应用程序时,我们需要为每个微服务创建一个具有自己的baseurl和身份验证机制等的Rest客户端。很少有可用的nuget包提供对REST API进行Http调用的基本框架。在本文中,我将围绕一个名为RestSharp的nuget包创建Rest客户端。

请参阅HttpRestClient.cs文件中的abstract类。它包含了通用同步和异步方法Get Post Delete和Put。

以该Post方法为例,它首先创建一个RestRequest对象并添加为RestService。 它还允许指定请求格式,可以是Json或XML。接下来,它使用ExecuteAsync和Execute方法执行Request。然后,它将响应反序列化到相应的输出类。

public async Task PostAsync(string uriResource, T data, 
                     Dictionary headerParam = null)
      where T : class
      where S : new()
    {
      var request = GetRequestObject(Method.POST, uriResource, data, headerParam);
      var response = await Client.ExecuteAsync(request);
      S returnData = Deserialize(response.Content);
      return returnData;
    }

private RestRequest GetRequestObject(Method method, string uriResource, 
        T data = null, Dictionary headerParam = null) where T : class
    {
      var request = GetRequestObject(method, uriResource, headerParam);
      request.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
      request.AddBody(data);
      return request;
    }

它还支持为WebRequest处理多个参数。

HttpRestClient作为一个abstract类需要在微服务特定RestClient中继承,我们可以在其中初始化服务的baseurl。在此示例中,它已实现为MicroServiceAHttpClient。

具体的服务方法可以从服务网关调用如下:

public ResponseA SaveData(RequestA data)
    {
      var response = _httpClient.Post
      ("", data, new Dictionary { { "UserId", "" }});
      return response;
    }

上述方法为解决方案设计提供了非常干净的网关和HttpClient实现。

https://www.codeproject.com/Tips/5300865/Designing-a-Generic-Http-Rest-Client-wrapper

关注
打赏
1665926880
查看更多评论
立即登录/注册

微信扫码登录

0.0472s