Annotation 与 HttpClient(5)--Annotation HttpClient

Annotation HttpClienthtml

本内容不保证正确性,若有问题请及时提出apache

通过前面四篇博客的铺垫,如今给出带有标记的HttpClient的实现。json

1.     带标记的HttpClient的需求和定义api

1)          Http的访问方法服务器

Http的访问方法主要有两种,分别是GetPost,对应的定义了两个Annotation@Get@Post分别表示实际调用执行的Http消息类型。网络

2)          HttpURLmybatis

URL用于定位Http访问的网络服务器地址和方法,对应定义了@URL并发

3)          Http参数的类型app

Http访问中,参数能够放在URL中(@ParamUrl)、放在QueryString中(@ParamQuery)、放在Head中(@ParamHead)、放在Body中(@ParamBody)。学习

此外对于Multipart类型(文件类型)的消息,定义了@ParamFileHttpFile

4)          默认的Http参数

不少状况下,在访问远程的Http请求可使用默认的参数,针对这种状况,定义了@ParamDefault@ParamDefaults

5)          返回类型

咱们只实现了两种返回类型,一种是String,一种是byte[]。若是须要其余复杂类型例如xmljson等,能够先返回String,而后再转换成须要的类型。若是须要返回的是文件类型,那么返回类型为byte[].

2.     项目中的类说明

MapperProxyMapperMethod,用于建立相应接口的代理,在代理中分析接口的Annotation,组织内部参数,生成调用Http的相应参数。

RestClientHttpTemplate提供了MapperMethod访问Http服务须要的接口,而DefaultRestClientDefaultHttpTemplate分别是上述两接口的实现。其中DefaultRestClient使用apache HttpClient的链接池形式实现的,而DefaultHttpTemplate则是经过继承SpringHttpTemplate实现的,能够根据须要替换掉这两个实现(好比使用并发的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

相关文章
相关标签/搜索