文章目录

概要

之前写过一篇《C#实现对调用外部系统API接口封装分享》,那只是一个简单的工具类。在咱们真实的项目中我们会应对多个不同的第三方系统(微服务场景更是调来调去),此时可能每个系统都有自己对于响应格式,身份认证规范,此时该如何应对呢?本次分享主要包含如何应对不同系统以及真实项目中如何封装使得我们调用第三方系统就像调用本地服务一样方便。这里需要说明的是我只是基于响应码均为200的情况实现

本次分享的代码我也开源gitee上,感兴趣的朋友可以看下https://gitee.com/jonas_shares/my-http-test

整体架构流程

  • 项目结构
    1、MyHttpTest.App 一个控制台程序,测试服务的
    2、MyHttpTest.Services 核心服务代码
    3、MyHttpTest.WebApi 一个WebApi的项目,示例真实项目如何结合DI使用
    在这里插入图片描述

  • 核心服务介绍
    1、抽象一个父类ServiceCallerBase实现对于基本Get和Post请求的封装;
    2、请求之前检查一下身份令牌,没有或者过期刷新令牌;
    3、请求失败判断如果是身份认证失败,刷新令牌,然后重试(当然重试还是失败就直接抛异常)。
    4、对于令牌刷新、判断是否是身份认证失败,定义两个抽象方法EnsureTokenAsync、IsVerificationFailed由子类去自行实现,当然这里请求的响应格式父类也是不管的,子类通过泛型传入;
    5、对于响应的结果,成功失败我们不可能每次都是写什么Code==0硬编码,所以建议都整个类似IsOK的属性
    6、Data的多种多样,所以我添加了一个GetData的泛型方法(DDD充血模型这里用就比较合适)。

  • WebApi集成
    1、DI注册的代码写在Global中,这里考虑到我们内部系统可能有固定规范,响应格式以及登录接口都约定一样的,那就可以使用同一个子类实现,但是多个系统BaseUrl等配置信息还是有区别,所以DI注册的时候有个key,拿实例也根据key来拿就行;

2、测试代码MyTestController中;

 public class MyTestController : BaseController
    {
        private readonly IIndex<string, ServiceCallerBase<ErpExtentionSystemResponse>> cllers;

        public MyTestController(IIndex<string, ServiceCallerBase<ErpExtentionSystemResponse>> cllers)
        {
            this.cllers = cllers;
        }

        [HttpGet]
        public async Task<IHttpActionResult> GetUserInfoAsync(string account)
        {
            var response = await cllers[OtherSystemKeys.ErpExtentionSystem].GetAsync("/api/User/QueryUserInfoByAccount?account=" + account);
            return response.IsOk ? Success(data: response.GetData<User>()) : Fail(response.Message);
        }


        public class User
        {
            public string Account { get; set; }
            public string RealName { get; set; }
        }
    }

封装到服务层使用起来就比较方便了

更多推荐