C# RESTful API 访问辅助类
REST 全称是 Representational State Transfer,有人说它是一种风格,并非一种标准,个人觉得挺有道理。它本身并没有创造新的技术、组件与服务,更像是告诉大家如何更好地使用现有Web标准中的一些准则和约束,也不可否认,RESTFul 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。
RESTful 风格的 API,在 HTTP 协议上使用的是标准 HTTP 方法,GET、PUT、POST 和 DELETE 等。
常用实践
(1)API 返回结果通常为 JSON 形式,请求的头部属性 Accept 通常设置为 application/json
(2)请求的 Body 数据部分使用 JSON 形式
(3)鉴权信息使用 JWT 等形式的授权码方式,放在请求头部属性中传输,属性名称自定义,如 auth,token 等等
辅助类设计
(1)属性定义
定义属性:TokenHeaderName
上述实践描述中,自定义部分为鉴权信息在头部属性中的名称,定义该属性表示这个名称。
定义属性:DefaultToken
考虑到鉴权信息在某些场景下可初始为一个固定值,定义该属性在默认情况下使用。
具体定义如下:
// 鉴权 token 的请求头属性名称
public String TokenHeaderName { get; set; }
// 默认的鉴权 token 信息
public String DefaultToken { get; set; }
(2)方法定义
方法定义跟标准的 HTTP 方法一致,这里定义常用的 Get、Put、Post、Delete 方法。
再抽取其中会重复的部分形成一些私有方法来复用,再重载一些方法使得可以应用默认参数值。
(2.1)构造方法
构造时可以指定鉴权头部属性名和 token,也可以不指定。
public RestApiVisitHelper()
{
}
// 构造时设置鉴权 token 的请求头属性名称
public RestApiVisitHelper(String tokenHeaderName)
{
TokenHeaderName = tokenHeaderName;
}
// 构造时设置鉴权 token 的请求头属性名称,以及默认的 token 值
public RestApiVisitHelper(String tokenHeaderName, String defaultToken){
TokenHeaderName = tokenHeaderName;
DefaultToken = defaultToken;
}
(2.2)访问所需辅助方法
(2.2.1) 创建 WebClient,设置好相关属性,包括鉴权头部信息
// 创建 WebClient 并设置好 token 信息
private WebClient CreateWebClient(String token)
{
System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
System.Net.WebClient webClientObj = new System.Net.WebClient();
webClientObj.Headers.Add("Accept", "application/json");
if (!String.IsNullOrEmpty(TokenHeaderName) && !String.IsNullOrEmpty(token))
{
webClientObj.Headers.Add(TokenHeaderName, token);
}
webClientObj.Encoding = Encoding.UTF8;
return webClientObj;
}
(2.2.2)将查询参数格式化拼接成最终 url
// 将查询参数格式化拼接到 url 上形成最终的访问地址
private String FormatUrl(String apiUrl, Hashtable queryParams)
{
String queryString = "";
foreach (var k in queryParams.Keys)
{
if (!String.IsNullOrEmpty(queryString))
{
queryString += "&";
}
queryString += String.Format("{0}={1}", k, queryParams[k]);
}
if (!String.IsNullOrEmpty(queryString))
{
apiUrl += "?" + queryString;
}
return apiUrl;
}
(2.2.3)异常统一处理
出现请求异常时,可以统一进行处理,具体返回结果可自行定义。
// 异常时返回的信息:应该根据实际需要进行返回
private String WhenError(Exception e)
{
JObject result = new JObject();
result["err_code"] = -1;
if (e is WebException)
{
var we = (WebException)e;
if (we.Response != null) // 如果有输出则仍然返回实际输出
{
return new StreamReader(we.Response.GetResponseStream()).ReadToEnd();
}
else
{
result["err_msg"] = we.Message;
}
}
else
{
result["err_msg"] = e.Message;
}
return result.ToString(Newtonsoft.Json.Formatting.None);
}
(2.3)公开方法具体实现
有了以上辅助方法,实现代码会变得简洁,且各个方法代码结构类似。以下以 Post 方法(包括重载) 为例展示基本实现。
/// <summary>
/// Post Api 返回结果文本,使用默认的鉴权 token
/// </summary>
/// <param name="apiUrl"></param>
/// <param name="queryParams"></param>
/// <param name="body"></param>
/// <returns></returns>
public String Post(string apiUrl, Hashtable queryParams, JObject body)
{
return Post(apiUrl, queryParams, body, DefaultToken);
}
/// <summary>
/// Post Api 返回结果文本
/// </summary>
/// <param name="apiUrl"></param>
/// <param name="queryParams"></param>
/// <param name="body"></param>
/// <param name="token"></param>
/// <returns></returns>
public String Post(string apiUrl, Hashtable queryParams, JObject body, String token)
{
System.Net.WebClient webClientObj = CreateWebClient(token);
apiUrl = FormatUrl(apiUrl, queryParams);
try
{
String result = webClientObj.UploadString(apiUrl, "POST", body.ToString(Newtonsoft.Json.Formatting.None));
return result;
}
catch (Exception ce)
{
return WhenError(ce);
}
}
完整源码
https://github.com/triplestudio/helloworld/blob/master/RestApiVisitHelper.cs
C# RESTful API 访问辅助类的更多相关文章
- MongoDB最简单的入门教程之五-通过Restful API访问MongoDB
通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...
- Spring MVC中使用 Swagger2 构建Restful API
1.Spring MVC配置文件中的配置 [java] view plain copy <!-- 设置使用注解的类所在的jar包,只加载controller类 --> <contex ...
- k8s restful API 结构分析
k8s的api-server组件负责提供restful api访问端点, 并且将数据持久化到etcd server中. 那么k8s是如何组织它的restful api的? 一, namespaced ...
- 一个Restful Api的访问控制方法
最近在做的两个项目,都需要使用Restful Api,接口的安全性和访问控制便成为一个问题,看了一下别家的API访问控制办法. 新浪的API访问控制使用的是AccessToken,有两种方式来使用该A ...
- 怎样从外网访问内网RESTful API?
本地部署了RESTful API,只能在局域网内访问,怎样从外网也能访问到本地的RESTful API呢?本文将介绍具体的实现步骤. 准备工作 部署并启动RESTful API服务端 默认部署的RES ...
- 转:一个Restful Api的访问控制方法(简单版)
最近在做的两个项目,都需要使用Restful Api,接口的安全性和访问控制便成为一个问题,看了一下别家的API访问控制办法. 新浪的API访问控制使用的是AccessToken,有两种方式来使用该A ...
- springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展
1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...
- Postman如何通过xmysql工具的Restful API 接口访问MySQL
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 有时候用 Postman 接口测试需要获取MySQL的查询结果做接口输出的校验,这里介绍下 Postman 通过 R ...
- C# RESTful API
C# RESTful API REST 全称是 Representational State Transfer,有人说它是一种风格,并非一种标准,个人觉得挺有道理.它本身并没有创造新的技术.组件与服务 ...
随机推荐
- Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来
首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我两年半的摩托罗拉里程碑一代就这么安息了,于是我今天决定怒更一记,纪念我死去的爱机. 如果你是网购达人,你的手机上一定少不了淘宝客户 ...
- Java设计模式透析之 —— 单例(Singleton)
写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...
- DDD实战11 在项目中使用JWT的token 进行授权验证
步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi { publi ...
- Openstack部署总结:“部署过程Error: Local ip for ovs agent must be set when tunneling is enabled”问题
问题叙述性说明 正在使用RDO当多节点部署测试,因为使用了一些老机器和机器类型的差异(一些HP的PC,有些DELL的PC).以下错误出现: Applying 192.168.40.107_neutro ...
- 图像处理与计算机视觉的 topics
光学图像(optical image): the apparent reproduction of an object, formed by a lens or mirror system from ...
- python3操作注册表设置/取消IE代理
import io, sys, time, re, os import winreg def enableProxy(IP, Port): proxy = IP + ":" + s ...
- OpenGL(十一) BMP真彩文件的显示和复制操作
glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型: glDrawPixels (GLsizei ...
- typescript调用javascript && URI.js
URI.js URI.js是一个用于处理URL的JavaScript库它提供了一个“jQuery风格”的API(Fluent接口,方法链接)来读写所有常规组件和许多便利方法,如.directory() ...
- x86汇编指令脚本虚拟机
简介 这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机. 非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用.能用.轻量就行,如果觉得代码架构设计的不是很好的话 ...
- Emgu-WPF学习使用-识别二维码的位置
原文:Emgu-WPF学习使用-识别二维码的位置 参考链接:http://blog.csdn.net/gaobobo138968/article/details/47663607 我完全参 ...