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的更多相关文章

  1. Java自定义Annotation,通过反射解析Annotation

    创建一个自定义的Annotation import java.lang.annotation.*; import java.lang.reflect.Method; @Documented @Targ ...

  2. Annotation之一:Java Annotation基本功能介绍

    一.元数据的作用 如果要对于元数据的作用进行分类,目前还没有明确的定义,不过我们可以根据它所起的作用,大致可分为三类: 编写文档:通过代码里标识的元数据生成文档.这是最常见的,也是java 最早提供的 ...

  3. Java注解Annotation的用法 - 自定义Annotation实现

    Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据. Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标 ...

  4. Android网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

    上文简介了HttpClient和Tomcatserver的交互,主角是HttpClient,然后它跟server交互有两种方式即get和post.所以这个HttpClient就相似于电脑上用的浏览器. ...

  5. ndroid网络(4):HttpClient必经之路----使用线程安全的单例模式HttpClient,及HttpClient和Application的融合

    上文简 单介绍了HttpClient和Tomcat服务器的交互,主角是HttpClient,然后它跟服务器交互有两种方式即get和post.所以这个 HttpClient就类似于电脑上用的浏览器.当我 ...

  6. HttpClient 4 和 HttpClient 3 超时

    HttpClient 4: 连接超时: httpclient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,6000 ...

  7. HttpClient get和HttpClient Post请求的方式获取服务器的返回数据

    1.转自:https://blog.csdn.net/alinshen/article/details/78221567?utm_source=blogxgwz4 /*  * 演示通过HttpClie ...

  8. 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)

    搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...

  9. Java注解annotation : invalid type of annotation member

    前言 首先,关于注解的介绍就不多描述了,网上有很多这方面的资料.本文主要是介绍如何处理标题中遇到的问题:invalid type of annotation member ? 正文 Annotatio ...

  10. 轻松把玩HttpClient之封装HttpClient工具类(五),携带Cookie的请求

    近期更新了一下HttpClientUtil工具类代码,主要是加入了一个參数HttpContext,这个是用来干嘛的呢?事实上是用来保存和传递Cookie所须要的. 由于我们有非常多时候都须要登录.然后 ...

随机推荐

  1. 安装eclipse

    前提,安装好jdk并成功配置好环境变量 下载eclipse-standard-kepler-R-win32-x86_64,直接打开里面的eclipse.exe文件即可

  2. What does cmd /C mean? [closed] 关于nodejs的子进程部分

    之前一直很不明白为什么 child_process.spawn(command[, args][, options]) shell <Boolean> | <String> I ...

  3. codec ruby和json格式输出

    zjtest7-frontend:/usr/local/logstash-2.3.4/config# cat geoip.conf input {stdin {} } filter { geoip { ...

  4. cf459E Pashmak and Graph

    E. Pashmak and Graph time limit per test 1 second memory limit per test 256 megabytes input standard ...

  5. 【LeetCode练习题】Evaluate Reverse Polish Notation

    Evaluate Reverse Polish Notation Evaluate the value of an arithmetic expression in Reverse Polish No ...

  6. 北京西服定做_衬衫定制_关于我们_Dimoon TLR.

    北京西服定做_衬衫定制_关于我们_Dimoon TLR.

  7. Linux下将多个静态库(.a)合并成一个静态库文件(.a)的命令操作,方法一

    .a 文件的结构和.tar文件就没有什么区别. x 命令解出来, a 命令添加, t命令列表 假设A.a, B.a C.a 在/usr/local/lib目录下 mkdir /tmp/libABC c ...

  8. Activity(二)

    多个Activity之间的调用 建立一个Activity 配置layout文件夹下fragment_main.xml文件 在layout下新建other.xml文件 xml文件创建的id需要编译才能生 ...

  9. html加载js那些事

    浏览器通过内置的JavaScript引擎,读取网页中的代码,对其处理后运行. JavaScript代码嵌入网页的方法 在网页中嵌入JavaScript代码有多种方法. 直接添加代码块 通过script ...

  10. C#核编之格式化编程

    一.格式化控制台输入输出 1. 在前面的随笔中,会经常看到诸如{0},{1}之类的标记嵌入在字符串变量中..NET引入一种字符串格式化的新风格.与C的printf()相似,简而言之,如果需要定义一个字 ...