Annotation 与 HttpClient(5)--Annotation HttpClient
Annotation HttpClient
本内容不保证正确性,如有问题请及时提出
经过前面四篇博客的铺垫,现在给出带有标记的HttpClient的实现。
1. 带标记的HttpClient的需求和定义
1) Http的访问方法
Http的访问方法主要有两种,分别是Get和Post,对应的定义了两个Annotation,@Get和@Post分别表示实际调用执行的Http消息类型。
2) Http的URL
URL用于定位Http访问的网络服务器地址和方法,对应定义了@URL。
3) Http参数的类型
在Http访问中,参数可以放在URL中(@ParamUrl)、放在QueryString中(@ParamQuery)、放在Head中(@ParamHead)、放在Body中(@ParamBody)。
此外对于Multipart类型(文件类型)的消息,定义了@ParamFile和HttpFile。
4) 默认的Http参数
很多情况下,在访问远程的Http请求可以使用默认的参数,针对这种情况,定义了@ParamDefault和@ParamDefaults。
5) 返回类型
我们只实现了两种返回类型,一种是String,一种是byte[]。如果需要其他复杂类型例如xml、json等,可以先返回String,然后再转换成需要的类型。如果需要返回的是文件类型,那么返回类型为byte[].
2. 项目中的类说明
MapperProxy和MapperMethod,用于创建相应接口的代理,在代理中分析接口的Annotation,组织内部参数,生成调用Http的相应参数。
RestClient和HttpTemplate提供了MapperMethod访问Http服务需要的接口,而DefaultRestClient和DefaultHttpTemplate分别是上述两接口的实现。其中DefaultRestClient使用apache HttpClient的连接池形式实现的,而DefaultHttpTemplate则是通过继承Spring的HttpTemplate实现的,可以根据需要替换掉这两个实现(比如使用并发的HttpClient)。
3. 项目使用举例
3.1 简单的weather访问实例
Dao定义如下:
@URL("http://m.weather.com.cn/data/{city}.html")
publicinterfaceWeatherDao {
@Get
String getWeather(@ParamUrl("city")int cityCode);
}
测试程序如下执行:
WeatherDao weather = MapperProxy.newMapperProxy(WeatherDao.class,new DefaultHttpTemplate());
System.out.println(weather.getWeather(101010100));
3.2 简单的微博访问实例
Dao定义:
@URL("https://api.weibo.com/2")
publicinterface WeiBoHttpDao {
//获取短url,使用https
@Get("/short_url/shorten.json")
public String getshortUrl(@ParamQuery("access_token") String accessToken,
@ParamQuery("source")long source,
@ParamQuery("url_long") String urlLong);
}
测试程序如下执行:
WeiBoHttpDao dao = MapperProxy.newMapperProxy(WeiBoHttpDao.class,new DefaultHttpTemplate());
System.out.println(dao.getshortUrl("token",xxxx,"url"));
3.3 人人网的访问
@URL("http://api.m.renren.com/api")
@ParamDefaults({
@ParamDefault(paramname="v",value="1.0",type=ParamType.BODY),
@ParamDefault(paramname="format",type=ParamType.BODY,value="JSON")})
publicinterface RenRenHttpDao {
@Post("/photos/uploadbin")
@ParamDefaults({
@ParamDefault(paramname="voice_rate",value="44100",type=ParamType.BODY),
@ParamDefault(paramname="default_album_switch",value="2",type=ParamType.BODY),
@ParamDefault(paramname="from",value="xxxxx",type=ParamType.BODY)
})
public String share(//分享
@ParamBody("access_token") String accessToken,
@ParamBody("call_id") String callId,
@ParamBody("caption") String caption,
@ParamFile("data") HttpFile data,
@ParamFile("voicedata") HttpFile voiceData,
@ParamBody("voice_length")long voiceLength,
@ParamBody("voice_size")long voiceSize,
@ParamBody("sig") String sig
);
@Post("/user/getInfo")
public String userInfo(//获取用户信息
@ParamBody("access_token") String accessToken,
@ParamBody("call_id") String callId,
@ParamBody("type")long type,
@ParamBody("sig") String sig);
@Post("/friends/getFriends")
@ParamDefaults({
@ParamDefault(paramname="hasGender",value="1",type=ParamType.BODY),
@ParamDefault(paramname="pageSize",value="600",type=ParamType.BODY)
})
public String getFriends(//获取好友列表
@ParamBody("access_token") String accessToken,
@ParamBody("call_id")long callId,
@ParamBody("page")long page,
@ParamBody("sig") String sig
);
}
4. 小结
通过五篇博客,我希望能够将如何编写annotation的应用说明清楚,如果你理解这个过程,会觉得很简单,但是要完全说明白却是一件极其复杂的事情,通过五篇博客的形式,展现了我脑中的annotation应用的实现方式,希望对大家有帮助。
文中叙述的这种方式,源自于mybatis的源码,大家也可以去参考。
最后,我将例子中的Annotation HttpClient的源码发出来供大家参考。源码很少,也很简单,并且在我觉得必要的地方加了注释,希望能帮助大家一起探讨学习。
源码在我的csdn下载里面。http://download.csdn.net/detail/guanxinquan/6019591
Annotation 与 HttpClient(5)--Annotation HttpClient的更多相关文章
- Java自定义Annotation,通过反射解析Annotation
创建一个自定义的Annotation import java.lang.annotation.*; import java.lang.reflect.Method; @Documented @Targ ...
- Annotation之一:Java Annotation基本功能介绍
一.元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: 编写文档:通过代码里标识的元数据生成文档.这是最常见的,也是java 最早提供的 ...
- Java注解Annotation的用法 - 自定义Annotation实现
Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据. Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标 ...
- Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合
上文简介了HttpClient和Tomcatserver的交互,主角是HttpClient,然后它跟server交互有两种方式即get和post.所以这个HttpClient就相似于电脑上用的浏览器. ...
- ndroid网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合
上文简 单介绍了HttpClient和Tomcat服务器的交互,主角是HttpClient,然后它跟服务器交互有两种方式即get和post.所以这个 HttpClient就类似于电脑上用的浏览器.当我 ...
- HttpClient 4 和 HttpClient 3 超时
HttpClient 4: 连接超时: httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,6000 ...
- HttpClient get和HttpClient Post请求的方式获取服务器的返回数据
1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /* * 演示通过HttpClie ...
- 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)
搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...
- Java注解annotation : invalid type of annotation member
前言 首先,关于注解的介绍就不多描述了,网上有很多这方面的资料.本文主要是介绍如何处理标题中遇到的问题:invalid type of annotation member ? 正文 Annotatio ...
- 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求
近期更新了一下HttpClientUtil工具类代码,主要是加入了一个參数HttpContext,这个是用来干嘛的呢?事实上是用来保存和传递Cookie所须要的. 由于我们有非常多时候都须要登录.然后 ...
随机推荐
- SQL Server 内存管理在64位时代的改变
64位机上 地址空间比以前大了去了.它引起的改变多了去了 1.MemToLeave这个词不存在了.因为SQL Server以不再做这种预留空间的事了,也就是说multiple page 想用多少就用 ...
- Nginx安装配置PHP(FastCGI)环境的教程
这篇是Nginx安装配置PHP(FastCGI)环境的教程.Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用. 一.什么是 FastCGI F ...
- hdu1258Sum It Up (DFS)
Description Given a specified total t and a list of n integers, find all distinct sums using numbers ...
- flume【源码分析】分析Flume的启动过程
h2 { color: #fff; background-color: #7CCD7C; padding: 3px; margin: 10px 0px } h3 { color: #fff; back ...
- Android通过HTTP POST带參訪问asp.net网页
在看了网络上非常多视频关于android通过HTTP POST或者GET方式訪问网页并获取数据的方法. 自己也copy了一份来測试.并通过C#.NET搭建了一个简单的后台,但发现传參时,依照网上的方式 ...
- 代码混淆 GSON完满解决
头疼的问题,json使用了google的gson三方包,可是混淆的时候出了问题 明明已经按照gson的官方文档,把混淆脚本加上去了,却还是出问题. 今天同事找到一篇博客,关于这个问题的: 我们是将js ...
- JS获取客户端IP地址、MAC和主机名七种方法
一.使用JS获取客户端IP的几个方法方法一(只针对IE且客户端的IE允许AcitiveX运行,通过平台:XP,SERVER03,2000).获取客户端IP代码:<HTML><HEAD ...
- java集合类深入分析之Queue篇(Q,DQ)
简介 Queue是一种很常见的数据结构类型,在java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约.实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现 ...
- CSS中为什么overflow:hidden能清除浮动(float)的影响?原理是什么?
http://www.zhihu.com/question/30938856 父块没有设置指定的高宽,当子块设置为浮动后,原本包裹子块的父块的高度塌陷消失,这时给父块设置overflow:hidden ...
- jquery实现带左右箭头和数字焦点的图片轮播手写代码
以前图片轮播经常用网上的插件,然后想说自己也要认真看看,一步一步弄明白,所以就自己研究写了个图片轮播的代码,我自己觉得还算是挺简单的.如有改进的地方,欢迎你能帮我指出,共同进步. (ps:博客园如何上 ...