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

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

介绍

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

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

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

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

public async Task<S> PostAsync<T, S>(string uriResource, T data, 
                     Dictionary<string, string> 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<S>(response.Content);
      return returnData;
    }

private RestRequest GetRequestObject<T>(Method method, string uriResource, 
        T data = null, Dictionary<string, string> 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<RequestA, ResponseA>
      ("<UriResource>", data, new Dictionary<string, string> { { "UserId", "<testUserId>" }});
      return response;
    }

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值