前言
在做项目的时候,用过一些http请求框架,例如:OkHttp3、Retrofit、RxEasyHttp等等
每个框架都有自己的特点和适用场景。在学习了反射和动态代理、阅读过Retrofit和RxEasyHttp的源码后,萌生了自己写一个http请求框架的想法,于是有了该项目:
该项目通过接口的形式调用。
该项目使用kotlin+反射+动态代理的方式来实现http请求发起的前置处理,使用Okhttp3来尽情网络请求。
一、简单使用
首先要写一个接口,然后在伴生类里面定义一个方法
interface HttpRequest {
companion object {
fun instance(config: XHHttpConfig? = null): HttpRequest {
return XHHttp.getInstance(HttpRequest::class.java, config)
}
}
}
以下示例采用鸿洋的玩安卓提供的API
https://www.wanandroid.com/blog/show/2
使用@GET、@POST等注解来发起请求,注解内填写后续接口地址,接口内定义ObserverCallBack回调来实现请求结果的回调,,请求需要参数的则直接写在参数里面
interface HttpRequest {
companion object {
fun instance(config: XHHttpConfig? = null): HttpRequest {
return XHHttp.getInstance(HttpRequest::class.java, config)
}
}
@GET("wxarticle/chapters/json")
fun getChapters(_callback: ObserverCallBack?)
@POST("article/query/0/json")
fun search(_callback: ObserverCallBack?, k: String = "kotlin")
}
然后使用的代码为
HttpRequest.instance().getChapters(callbackOf<String>{
start { }//请求之前
success {}//请求成功
failed { data, error ->
}//请求失败
complete { }//请求完成
})
其中,callbackOf为dsl语法,内置start、success、failed、complete方法。
start为开始请求之前调用的方法;请求结果为:success或者failed中的一个;请求结束以后,调用complete方法
二、使用复杂参数
参数的类型同时也支持Map<String,String>
复杂参数的注解有
注解 | 标注位置 | 描述 |
---|---|---|
@Path | 接口的参数 | 用于动态替换接口方法上注解的url中的字段 |
@Param | 接口的参数 | 用于标注改参数为类 |
@ParamRename | 参数的类内部 | 用于标注参数类的某个属性的在构建url的时候的真实字段 |
@ParamIgnore | 参数的类内部 | 用于忽略某个字段 |
@Path
如果动态替换请求地址的字段,就使用“{}”这个标志这个需要替换的字段,在参数里面使用@Path注解标注,注解的参数为需要替换的字符串内容,如下
interface HttpRequest {
companion object {
fun instance(config: XHHttpConfig? = null): HttpRequest {
return XHHttp.getInstance(HttpRequest::class.java, config)
}
}
@GET("article/list/{path}/json")
fun getArticleJson(_callback: ObserverCallBack?, @Path("path") page: String)
}
使用如下
HttpRequest.instance().getArticleJson(
callbackOf<String> {
success {
showResult(it)
}
failed { data, error ->
}
},"0")
通过注解标注,“{path}”被替换成了“0”,最后的请求地址为
article/list/0/json
@Param
标注使用类作为参数,类里面的属性被自动解析为实际的参数
data class Author(
@ParamRename("author")//重命名为author
var name: String,
@ParamIgnore()//忽略该字段
var id: String
)
定义接口
interface HttpRequest {
companion object {
fun instance(config: XHHttpConfig? = null): HttpRequest {
return XHHttp.getInstance(HttpRequest::class.java, config)
}
}
@GET("article/list/0/json")
fun getArticleByAuthorName(callBack: ObserverCallBack, @Param authorEntity: Author)
}
使用
HttpRequest.instance()
.getArticleByAuthorName(
callbackOf<String> { },
Author("鸿洋", "777")
)
最后请求的地址就是以下内容
https://www.wanandroid.com/article/list/0/json?author=%E9%B8%BF%E6%B4%8B
网友评论