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. 初学swift笔记 枚举(七)

    import Foundation /* 枚举 语法结构 enum 类型 { case 值 } */ //定义一个枚举 写法1 enum LiuShiQun { case Name case Age ...

  2. flask-script 安装问题

    > 昨天开始看 flask,第二章最后提到使用 Flask-Script 支持命令行选项,但是用书上的方法安装却出现了问题. 错误信息: 注意最后两行: Could not find a ver ...

  3. Objextive-C几道小题目笔记

    //掷骰子题,掷骰子100次,输出每个号出现的次数 void one() { for (int i=1; i<=100; i++) { int a = arc4random() % 6 +1; ...

  4. ZigBee 技术简介

       Zigbee是IEEE 802.15.4协议的代名词.根据这个协议规定的技术是一种短距离.低功耗的无线通信技术.这一名称来源于蜜蜂的八字舞,由于蜜蜂(bee)是靠飞翔和“嗡嗡”(zig)地抖动翅 ...

  5. Java常见序列化与反序列方法总结

    很多商业项目用到数据库.内存映射文件和普通文件来完成项目中的序列化处理的需求,但是这些方法很少会依靠于Java序列化.本文也不是用来解释序列化的,而是一起来看看面试中有关序列化的问题,这些问题你很有可 ...

  6. PF_RING packet overwrites

    最近在用 PF_RING 抓包过程中,发现个灵异的现象,高流量丢包时, 经常会出现正在处理的包的内容被覆盖.开始,怀疑是不是自己程序有地方越界写了,后来发现,如果自己拷贝一份,然后处理拷贝的那份,永远 ...

  7. TCP的那些事(转载)

    (转载本站文章请注明作者和出处 酷 壳 – CoolShell.cn ,请勿用于任何商业用途) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身 ...

  8. Nim游戏博弈

    Nim游戏的概述: 还记得这个游戏吗? 给出n列珍珠,两人轮流取珍珠,每次在某一列中取至少1颗珍珠,但不能在两列中取.最后拿光珍珠的人输. 后来,在一份资料上看到,这种游戏称为"拈(Nim) ...

  9. 推荐一款JavaScript日历控件:kimsoft-jscalendar

    一.什么是 kimsoft-jscalendar     一个简洁的avaScript日历控件,可在Java Web项目,.NET Web 项目中使用 二.kimsoft-jscalendar 有什么 ...

  10. Android SDK目录结构和工具介绍

    Android SDK目录结构和工具介绍是本文要介绍的内容,主要是来了解并学习Android SDK的内容,具体关于Android SDK内容的详解来看本文. AD: Android SDK目录结构和 ...