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 访问辅助类的更多相关文章

  1. MongoDB最简单的入门教程之五-通过Restful API访问MongoDB

    通过前面四篇的学习,我们已经在本地安装了一个MongoDB数据库,并且通过一个简单的Spring boot应用的单元测试,插入了几条记录到MongoDB中,并通过MongoDB Compass查看到了 ...

  2. Spring MVC中使用 Swagger2 构建Restful API

    1.Spring MVC配置文件中的配置 [java] view plain copy <!-- 设置使用注解的类所在的jar包,只加载controller类 --> <contex ...

  3. k8s restful API 结构分析

    k8s的api-server组件负责提供restful api访问端点, 并且将数据持久化到etcd server中. 那么k8s是如何组织它的restful api的? 一, namespaced ...

  4. 一个Restful Api的访问控制方法

    最近在做的两个项目,都需要使用Restful Api,接口的安全性和访问控制便成为一个问题,看了一下别家的API访问控制办法. 新浪的API访问控制使用的是AccessToken,有两种方式来使用该A ...

  5. 怎样从外网访问内网RESTful API?

    本地部署了RESTful API,只能在局域网内访问,怎样从外网也能访问到本地的RESTful API呢?本文将介绍具体的实现步骤. 准备工作 部署并启动RESTful API服务端 默认部署的RES ...

  6. 转:一个Restful Api的访问控制方法(简单版)

    最近在做的两个项目,都需要使用Restful Api,接口的安全性和访问控制便成为一个问题,看了一下别家的API访问控制办法. 新浪的API访问控制使用的是AccessToken,有两种方式来使用该A ...

  7. springMvc接口开发--对访问的restful api接口进行拦截实现功能扩展

    1.视频参加Spring Security开发安全的REST服务\PART1\PART1 3-7 使用切片拦截REST服务三通it学院-www.santongit.com-.mp4 讲的比较的经典,后 ...

  8. Postman如何通过xmysql工具的Restful API 接口访问MySQL

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 导语 有时候用 Postman 接口测试需要获取MySQL的查询结果做接口输出的校验,这里介绍下 Postman 通过 R ...

  9. C# RESTful API

    C# RESTful API REST 全称是 Representational State Transfer,有人说它是一种风格,并非一种标准,个人觉得挺有道理.它本身并没有创造新的技术.组件与服务 ...

随机推荐

  1. Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来

    首先题外话,今天早上起床的时候,手滑一下把我的手机甩了出去,结果陪伴我两年半的摩托罗拉里程碑一代就这么安息了,于是我今天决定怒更一记,纪念我死去的爱机. 如果你是网购达人,你的手机上一定少不了淘宝客户 ...

  2. Java设计模式透析之 —— 单例(Singleton)

    写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上线后还可以帮助你分析数据.但是Java原生带有的System.out.println()方法却很少在真正的项目开发中使用,甚至像f ...

  3. DDD实战11 在项目中使用JWT的token 进行授权验证

    步骤: 1.首先要在webapi的管道中 使用认证(Authentication) 2.要在webapi的服务中注册验证条件 代码如下: namespace Dealer.WebApi { publi ...

  4. 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 ...

  5. 图像处理与计算机视觉的 topics

    光学图像(optical image): the apparent reproduction of an object, formed by a lens or mirror system from ...

  6. python3操作注册表设置/取消IE代理

    import io, sys, time, re, os import winreg def enableProxy(IP, Port): proxy = IP + ":" + s ...

  7. OpenGL(十一) BMP真彩文件的显示和复制操作

    glut窗口除了可以绘制矢量图之外,还可以显示BMP文件,用函数glDrawPixels把内存块中的图像数据绘制到窗口上,glDrawPixels函数原型: glDrawPixels (GLsizei ...

  8. typescript调用javascript && URI.js

    URI.js URI.js是一个用于处理URL的JavaScript库它提供了一个“jQuery风格”的API(Fluent接口,方法链接)来读写所有常规组件和许多便利方法,如.directory() ...

  9. x86汇编指令脚本虚拟机

    简介 这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机. 非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用.能用.轻量就行,如果觉得代码架构设计的不是很好的话 ...

  10. Emgu-WPF学习使用-识别二维码的位置

    原文:Emgu-WPF学习使用-识别二维码的位置    参考链接:http://blog.csdn.net/gaobobo138968/article/details/47663607    我完全参 ...