BeetleX之HttpClusterApi应用详解
之前的文章已经介绍过如何使用HttpClusterApi
进行去中心化的HTTP集群服务访问,这一章主要详细讲述如何使用HttpClusterApi
,主要包括如何定义节点,创建服务接口和使用接口描述不同情况下的WebApi服务。最后通过HttpClusterApi简便地
调用百度的一些云服务接口。
介绍
通过名称大概也能了解它的功能,通过它可以描述和调用不同的webapi服务应用;它提供了不同Url对应不同服务绑定和创建接口代理调用功能,从而让使用者通过接口的方式即可完成webapi的调用并不像传统WebHttpRequest或HttpClient那样编写大量繁琐的基础代码。
方法
组件提供了以下方法来添加服务地址
HttpClusterApi AddHost(string url, string host, int weight = )//设置url对应节点的host信息,默认权重是10,权重值可以根据自己实际情况来配置
HttpClusterApi AddHost(string url, params string[] host)//设置url对应节点的host信息,默认权重是10
HttpClusterApi SetNode(string url, IApiNode node)//设置url对应的节点信息
Url
参数是一个正则表达式,用于匹配请求的url;当url值为*
的时候该host是最低级匹配项,当没有任何匹配host的情况下才使用'*'对应的host.
INodeSourceHandler NodeSourceHandler { get; set; }
在之前的文章已经有所介绍,是用于自定义集群信息源,通过这个属性可以绑定集群信息来源,这样使用者就可以通过数据库,缓存或第方服务来加载集群负载信息.
public T Create<T>()
方法是创建一个接口代理,通过代理操作即可实现具体的HTTP请求,组件对接口的定义具有一定的限制性,虽然不用继承某些基础接口,但要通过一些组件提供的Attribute
定义在方法或参数上.
public ClusterStats Stats()
方法获取统计信息,可以得到每个url对应不同host的调用情况统计.
线程安全问题
HttpClusterApi
是一个线程安全类,定义后可以在任意线程中同时使用;由于内部使用连接池的方式进行请求,所以并不用担心数据访问冲突的情况出现.Create<T>
返回的代理对象也是线程安全的,所以只需要创建一个接口实例接口即可随意调用.
接口定义
组件通过接口的方式来进行请求处理,所以并不需要编写任何基础的HTTP通讯代码,为了达到实际应用的需要,组件提供一些Attribute
来代替基础代码的编写.下面介绍一些这些Attribute
的作用.
请求描述
组件暂只支持GET,POST,PUT,DELETE这几种请求描述,这些属性只能标记在接口方法上,用于描述方法指向那种请求方式.Route
属性用于描述请求的路径,默认是根路径并使用方法名称作为URL
[AttributeUsage(AttributeTargets.Method)]
public class GetAttribute : Attribute
{
public string Route { get; set; }
}
[AttributeUsage(AttributeTargets.Method)]
public class PostAttribute : Attribute
{
public string Route { get; set; }
}
[AttributeUsage(AttributeTargets.Method)]
public class DelAttribute : Attribute
{
public string Route { get; set; }
}
[AttributeUsage(AttributeTargets.Method)]
public class PutAttribute : Attribute
{
public string Route { get; set; }
}
数据转换器
数据转换器用于描述请求和响应数据流的处理方式,组件暂只提供两种转换器FormUrlFormater
和JsonFormater
,分别对应的Content-Type是:application/json
和application/x-www-form-urlencoded
.如果这两种都不能满足实际应用需要的情况下可以通过继承以下对象
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Class)]
public abstract class FormaterAttribute : Attribute, IClientBodyFormater
{
public abstract string ContentType { get; } public abstract void Serialization(object data, PipeStream stream); public abstract object Deserialization(BeetleX.Buffers.PipeStream stream, Type type, int length);
}
数据转换器可以标识在接口或方法上,如果方法有标识的情况下则方法标识的转换器优先使用.如果没有标记转换器组件默认使用FormUrlFormater
参数描述
在HTTP请求中主要有三种类型的参数,分别是Header
,QueryString
和Body;如果接口方法标记为POST或PUT的情况,方法参数默认是Body参数类型,会写入到HTTP的Body中.组件提供两个Attribute
来描述参数应用到Header
,和QueryString
CHeader
可以用于接口或方法上,并可以同时标记多个;当用在接口或方法的时候需要指定name和value.如果用在参数name和value都可以缺省,自动拿参数名和参数值.CHeader的内容会自动写入HTTP的header里.
CQuery
可以用于接口或方法上,并可以同时标记多个;当用在接口或方法的时候需要指定name和value.如果用在参数name和value都可以缺省,自动拿参数名和参数值.CQuery的内容会自动附加到URL上,并进行URL编码
SSL访问
组件并不需要针对SSL做特别的配置,会自动根据添加的host是不是https
来确定,如果是https
情况下组件会自动针对这host启用SSL配置.
百度车牌识别接口实现
考虑到实际应用的便利性,以下简单使用组件描述一下百度云下的车牌识别调用.
引用组件
接口功能定义
调用这个接口主要涉及到两个方法,先是获取access_token
,然后再调用识别方法;针对这两个方法定义接口如下:
[BaiduApiFormater]
public interface IBaiduApi
{
[Get(Route = "oauth/2.0/token")]
[CQuery("client_id", "HiSRszPD******mqHfIz7VOrg")]
[CQuery("client_secret", "y7MxdEIItD******YqtalU6b4iF")]
Task<token> GetToken(string grant_type = "client_credentials");
[Post(Route = "rest/2.0/ocr/v1/license_plate")]
Task<PlateData> Plate([CQuery]string access_token, string image, string multi_detect = "false");
}
由于百度的数据提交是application/x-www-form-urlencoded
返回是josn;所以需要简单地实现一个对应的数据解释器
public class BaiduApiFormater : BeetleX.FastHttpApi.Clients.FormUrlFormater
{
public override object Deserialization(PipeStream stream, Type type, int length)
{
using (stream.LockFree())
{
if (type == null)
{
using (System.IO.StreamReader streamReader = new System.IO.StreamReader(stream))
using (JsonTextReader reader = new JsonTextReader(streamReader))
{
JsonSerializer jsonSerializer = JsonSerializer.CreateDefault();
object token = jsonSerializer.Deserialize(reader);
return token;
}
}
else
{
using (StreamReader streamReader = new StreamReader(stream))
{
JsonSerializer serializer = new JsonSerializer();
object result = serializer.Deserialize(streamReader, type);
return result;
}
}
}
}
}
相关工作准备好之后就可以使用接口进行功能调用了
BeetleX.FastHttpApi.Clients.HttpClusterApi httpClusterApi = new BeetleX.FastHttpApi.Clients.HttpClusterApi();
httpClusterApi.AddHost("*", "https://aip.baidubce.com");
IBaiduApi api = httpClusterApi.Create<IBaiduApi>();
var token = await api.GetToken();
var result = await api.Plate(token.access_token, GetImageData());
这样一个百度车牌识别的接口调用就完成了,使用上是不是比传统的WebHttpRequest和httpclient要方便很多?
BeetleX之HttpClusterApi应用详解的更多相关文章
- BeetleX之XRPC使用详解
XRPC是基于BeetleX扩展一个远程接口调用组件,它提供基于接口的方式来实现远程服务调用,在应用上非常简便.组件提供.NETCore2.1和.NETStandard2.0的client版本,因此即 ...
- Linq之旅:Linq入门详解(Linq to Objects)
示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...
- 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)
一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...
- Java 字符串格式化详解
Java 字符串格式化详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. 在 Java 的 String 类中,可以使用 format() 方法 ...
- Android Notification 详解(一)——基本操作
Android Notification 详解(一)--基本操作 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Notification 文中如有纰 ...
- Android Notification 详解——基本操作
Android Notification 详解 版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天项目中有用到 Android 通知相关的内容,索性把 Android Notificatio ...
- Git初探--笔记整理和Git命令详解
几个重要的概念 首先先明确几个概念: WorkPlace : 工作区 Index: 暂存区 Repository: 本地仓库/版本库 Remote: 远程仓库 当在Remote(如Github)上面c ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
随机推荐
- .Net core Web API导出数据到Excel
前言 产品经理有一个需求,就是将cosmosDB里的数据,导出到Excel中. 1.新建一个.net core web api controller 添加引用:EPPlus.Core Install- ...
- 【NOIP模拟赛】随
题目链接: 172.18.111.252:800/problem.php?cid=1001&pid=0 题解: 膜达神……(NOIP考这个就等爆零吧……) 显然我们得到一个结论:$ans=\s ...
- linux系统光盘开机自动挂载-配置本地yum源
一.光盘开机自动挂载 1.修改配置文件 执行命令 :vi /etc/fstab 添加/dev/cdrom /mnt iso9660 ...
- (1)STM32使用HAL库操作GPIO
一 初始化GPIO 使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成. 自动生成的HAL库GPIO初始化代码: static void MX_GPIO_Init( ...
- C# 语言历史版本特性(C# 1.0到C# 8.0汇总)
历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有17年的历史,语言本身具有丰富的特性,微软对其更新支持也十分支持.微软将C#提交给标准组织ECMA,C# 5.0目前是ECM ...
- set命令详解
我们依然是围绕这几个话题展开学习: 1.什么是set命令? 2.为什么要用set命令? 3.怎样使用set命令? 1.什么是set命令? ♦ set命令作用主要是显示系统中已经存在的shell变量,以 ...
- SOLID原则(OOD&OOP)
SOLID原则是面向对象编程和面向对象设计的头五大原则.学习及应用这五大原则可以构建一个易于维护和扩展的应用程序,我们一起看看到底是那五大原则. S--单一责任原则(SRP) --Single Res ...
- javascript正则表达式学习(二)--位置匹配
文章首发于sau交流学习社区 一.前言 正则表达式是匹配模式,要么是匹配字符,要么匹配位置. 其实在开发中很少用到匹配位置,本篇文章主要包含: 二.什么是位置 位置:相邻字符之间的位置. 三.如何匹配 ...
- 前端笔记之ES678&Webpack&Babel(上)初识ES678&Babel&let和const&解构&语法
一.ES版本简介和调试运行方法 1.1 ECMAScript简介 MDN手册:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript JavaS ...
- 阿里云ecs centos7安装 postgresql 9.4
rpm -Uvh http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-3.noarch.rpm yum insta ...