引言
在日常开发中经常会对接第三方接口,所以经常需要封装第三方接口,方便在程序中使用,本文主要是封装JSON格式的HTTP第三方接口,将入参和出参都从json对象转化为class ,方便调用。
实现思路,应用
反射typeof()、
HttpWebRequest、
泛型类、
Newtonsoft.Json,
将一个http请求的过程封装聚合起来。
具体代码如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using Newtonsoft.Json;namespace Sample.Api
{public class SampleApi{#region data//通过配置文件获取第三方接口的url共同头部public static string ApiUrl = ConfigurationManager.AppSettings["ApiUrl"];//如:http://localhost:8080/#endregion#region Base 基本封装实现public class HttpResponse{public HttpStatusCode Statue { get; set; }public string Data { get; set; }}/// <summary>/// http请求类型/// </summary>public enum RequestMethod{Post = 0,Get = 1,Put = 2,Delete = 3}public class HttpResponseResult<TRetData>{public HttpStatusCode StatusCode { get; set; }public TRetData Data { get; set; }public string Message { get; set; }}/// <summary>/// 第三方接口的基础类,方便校验、共用的参数继承/// </summary>public class ApilBase{}/// <summary>/// http请求/// </summary>/// <param name="url">url</param>/// <param name="method">请求方法</param>/// <param name="getDic">get请求入参</param>/// <param name="postStr">post请求入参</param>/// <param name="head">请求头入参</param>/// <param name="contentType">报文类型</param>/// <param name="timeout">超时时长(毫秒)</param>/// <returns></returns>public static HttpResponse HttpRequestAsync(string url, RequestMethod method, Dictionary<string, string> getDic = null, string postStr = "", Dictionary<string, string> head = null, string contentType = "application/json", int timeout = 20000){try{//参数处理if (getDic != null && method == RequestMethod.Get && getDic.Any()){StringBuilder builder = new StringBuilder();int i = 0;foreach (var item in getDic){if (i > 0)builder.Append("&");builder.AppendFormat("{0}={1}", item.Key, item.Value);i++;}if (!string.IsNullOrWhiteSpace(builder.ToString())){url = url + "?" + builder.ToString();}}HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);req.Method = typeof(RequestMethod).GetEnumName(method) ?? string.Empty;req.ContentType = contentType;req.Timeout = timeout;if (head != null && head.Any()){foreach (var item in head){req.Headers.Add(item.Key, item.Value);}}if (method != RequestMethod.Get && !string.IsNullOrWhiteSpace(postStr)){byte[] data = Encoding.UTF8.GetBytes(postStr);req.ContentLength = data.Length;using (Stream reqStream = req.GetRequestStream()){reqStream.Write(data, 0, data.Length);reqStream.Close();}}HttpWebResponse resp = (HttpWebResponse)req.GetResponse();//获取响应内容HttpResponse result = new HttpResponse();result.Statue = resp.StatusCode;Stream stream = resp.GetResponseStream();using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)){result.Data = reader.ReadToEnd();}return result;}catch (Exception e){//获取响应内容HttpResponse result = new HttpResponse();result.Statue = HttpStatusCode.BadRequest;result.Data = e.ToString();return result;}}/// <summary>/// http请求处理/// </summary>/// <typeparam name="TRequest"></typeparam>/// <typeparam name="TResponse"></typeparam>/// <param name="input"></param>/// <returns></returns>public static  HttpResponseResult<TResponse> HttpRequest<TRequest, TResponse>(TRequest input) where TRequest : ApilBase{HttpResponseResult<TResponse> ret = new HttpResponseResult<TResponse>();var param = GetParams(input);var response = HttpRequestAsync(param.Url, param.Method, param.GetDic, param.PostStr, param.Head, param.ContextType, param.Timeout);ret.StatusCode = response.Statue;if (ret.StatusCode == HttpStatusCode.OK){ret.Data = JsonConvert.DeserializeObject<TResponse>(response.Data);ret.Message = "成功";}else{ret.Message = response.Data;}return ret;}/// <summary>/// 业务级HTTP处理/// </summary>/// <typeparam name="TRequest"></typeparam>/// <param name="req"></param>/// <returns></returns>private static RequestParam GetParams<TRequest>(TRequest req){var result = new RequestParam(){Url = ApiUrl,Method = RequestMethod.Post,Head = new Dictionary<string, string>(),GetDic = new Dictionary<string, string>(),ContextType = "application/json",PostStr = "",Timeout = 20000,};//通过发射获取具体接口入参的类名var tRequestStr = typeof(TRequest).Name;//通过具体入参类名做相应的HTTP请求处理switch (tRequestStr){//登录接口的具体转换case "LoginReqDto":result.Url = result.Url + "api/Login";result.Method = RequestMethod.Post;result.PostStr = JsonConvert.SerializeObject(req);break;//以后的第三方接口都可以添加出入参类后,在此处理http请求}return result;}/// <summary>/// 根据字典获取get请求入参处理/// </summary>/// <typeparam name="T"></typeparam>/// <param name="input"></param>/// <returns></returns>private static Dictionary<string, string> ClassToDic<T>(T input){var result = new Dictionary<string, string>();var props = typeof(T).GetProperties();if (props.Any()){foreach (var item in props){var value = item.GetValue(input);if (value != null){result.Add(item.Name, value.ToString());}}}return result;}private class RequestParam{public string Url { get; set; }public RequestMethod Method { get; set; }public Dictionary<string, string> Head { get; set; }public Dictionary<string, string> GetDic { get; set; }public string PostStr { get; set; }public string ContextType { get; set; }public int Timeout { get; set; }}#endregion#region Method 例子/// <summary>/// 例子,第三方登录接口的入参 json Dto/// </summary>public class LoginReqDto : ApilBase{public string userName { get; set; }public string password { get; set; }}/// <summary>/// 例子,第三方登录接口的出参 json Dto/// </summary>public class LoginResDto : ApilBase{public string  data { get; set; }}/// <summary>/// 例子,第三方登录接口的使用/// </summary>public static void Login(){var input = new LoginReqDto(){userName = "admin",password = "123456",};var ret = HttpRequest<LoginReqDto, LoginResDto>(input);if (ret.StatusCode == HttpStatusCode.OK){//请求成功,具体处理业务代码}else{//请求失败,错误处理代码}}#endregion}}

总结:
这个封装类方便了第三方接口的调用
优点:实现代码的高效复用,以后维护、删除、添加接口起来很方便。
缺点也是有的,就是当第三方接口很多的时候,通过switch遍历找到相应的接口处理速度可能会慢,排在越往后的接口越慢。(目前日常几百个接口还是没有速度上的问题)。
好久没有写文章,我要从新培养写文章的习惯了。

C# 封装对第三方接口的调用相关推荐

  1. 如何使用OpenFeign实现对于第三方接口的调用

    导语   在开发中,我们经常会遇到一些对于第三方接口的调用,在加上现在很多的服务都是通过微服务的方式实现的,很多的服务都是通过注册中心进行代理,这个时候OpenFeign就显得尤为重要了,但是在开发中 ...

  2. html第三方接口,关于调用三方平台接口与推送接口的总结(2020.7.27)

    前言:本篇博客是接着上篇总结写的,想了解怎么对接第三方平台接口的同学可以看我上一篇博客,地址是  https://www.cnblogs.com/alanturingson/p/13377500.ht ...

  3. 微信公众号第三方接口的调用

    总结一下我在项目中使用微信第三方接口 1.准备工作,首先要引入微信的第三方开放接口的js文件 <script type="text/javascript" src=" ...

  4. java异步调用第三方接口_Java调用第三方系统接口获取数据

    1,调取接口代码 RestTemplate restTemplate=new RestTemplate();HttpHeaders headers=new HttpHeaders();MultiVal ...

  5. java调用第三方接口_java调用第三方接口,获取接口返回的数据。

    java接收远程调用的数据,得到的是如上个数的返回内容,我怎么写才能获取到值,现在使用的请求方法如下: public static HttpResult postJsonData(String url ...

  6. Http调用第三方接口的两种方式实例《超详细!!!》***

    Http调用第三方接口的两种方式<超详细!!!>* 最近在公司做一些调用第三方接口的工作,查阅了一部分的资料和向前辈以及朋友请教,完成了第三方接口的调用,其实主要是通过第三方提供的文档,完 ...

  7. php 自己封装一个调用第三方接口的函数

    ①在php.ini中开启php_curl扩展(必须开启) ②建议在php.ini中开启php_openssl扩展(本身不是curl必须的,是调用一些第三方接口需要的 ③如果以上操作重启apache后, ...

  8. http方式调用第三方接口

    java如何调用对方http接口(II) - 流年煮雪 - 博客园 纯Java api HttpURLConnection Java调用外部接口_CJD的博客-CSDN博客_调用外部接口 纯Java  ...

  9. python封装第三方接口_PYTHON 实现 SIGN 签名: 用于提供给外部(第三方) 做系统对接...

    简介 sign 签名是用于提供给外部(第三方)调用的接口,调用方需要提供正确的 appkey 钥匙才能调用,确保了接口的安全性. 前言 在 app 开放接口 api 的设计中,避免不了的就是安全性问题 ...

最新文章

  1. 主成分分析(PCA):通过图像可视化深入理解
  2. 享元模式(FlyWeight)
  3. 如何在Android平台下进行Socket通信
  4. java 年历_逆转监督漫画
  5. java short 写法_Java Short longValue()用法及代码示例
  6. tomcat中关于websocket的性能优化配置
  7. 17.explain_api
  8. ListString 和 ArrayListString的区别
  9. 判断一个java对象中的属性是否都未赋值_100道Java基础面试题(一)
  10. 今日宜发布融资消息:明略、智行者、Video++分获BAT投资
  11. (十七)spring cloud微服务分布式云架构-eureka 基础
  12. win10显卡驱动怎么装_还在花钱装系统吗,3分钟教你怎么安装纯净版Win10
  13. 用SPSS做数据分析(1)
  14. 人间不值得。在既定的规则面前,除了遵守,还能有什么?
  15. EasyGBS国标视频云服务平台可以获取录像却无法播放是什么原因?
  16. 四、redi性能测试、协议、事务
  17. ps抠图——抠出自己想要的素材(钢笔工具的使用)
  18. mocha 测试 mysql_GitHub - WePoem/lei: 整合Express mysql ioredis ejs 的一开发框架,使用mocha对api进行测试...
  19. 学C++和嵌入式,未来发展好不好?
  20. 跟着团子学SAP PS:如何查询PS模块中的user exits以及相关BAdIs SE80/SMOD/CNEX006/CNEX007/CNEX008

热门文章

  1. GRT手势识别工具包在Windows系统下的的安装与编译
  2. State of Survival,SLG游戏出海的又一佳作
  3. summernote 图片上传 php,summernote.js图片上传的使用
  4. 如何快速的Github下载超具体操作
  5. 阿里云学生版服务器从零搭建教程
  6. 亿赞普:大数据成就精准营销
  7. 迈来芯melexis氛围灯芯片批量烧录程序解决方案,支持Fast LIN,速度媲美官方烧录器!...
  8. 装修技术贴,不要装修完后悔的79件事
  9. 分享一遍好文章--宁静以致远
  10. python爬虫解析js_python爬虫解析js