Retrofit结构图如下:
1、请求方法注解
@patch请求,该请求是对get请求的补充,用于更新局部资源
@http请求,通用注解,可以替换以上所有的注解,其拥有三个属性,method,path,hasBody
2、请求头注解
@Headers,用于添加固定请求头,可以同时添加多个,通过该注解添加的请求头不会相互覆盖,而是共同存在
@hHeader,作为方法的参数传入,用于添加不固定值得Header,该注解会更新已有得请求头
3、请求参数注解
@Body,多用于post请求发送非表单数据,比如想要以post格式传递json格式数据
@Filed、@FiledMap,多用于post请求中表单字段,Filed和FiledMap需要FormUrlEncoded结合使用
@Part、@PartMap,用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传得情况
@path,用于url中得占位符
@Query、@QueryMap,用于Get中指定参数
@Url,指定请求路径
4、请求和响应格式注解
@FormUrlEncoded,表示请求发送编码表单数据,每个键值对需要使用@Field注解
@Multipart,便是请求发送multipart数据,需要配合使用@Part
@Streaming,表示响应用字节流得形式返回,如果没使用该注解,默认会把数据全部载入到内存中,该注解在在下载大文件得时候特别有用
5、使用
5.1、添加依赖:
/*retrofit*/
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'//json转换
5.2、定义一个静态类:
object MyRetrofit {
private val client = OkHttpClient.Builder() //builder构造者设计模式
.connectTimeout(10, TimeUnit.SECONDS) //连接超时时间 .readTimeout(10,TimeUnit.SECONDS) //读取超时
.writeTimeout(10,TimeUnit.SECONDS) //写超时,也就是请求超时
.build()
private val retrofit:Retrofit = Retrofit.Builder()
.client(client)
.baseUrl("http://123.56.232.18:8080/serverdemo")//网络请求的域名,就是网址公用部分
.addConverterFactory(GsonConverterFactory.create())//数据转换适配器
.build()
/*
* public <T> T create(final Class<T> service){
* }
* java写法,等同于下面
* */
fun <T> create(clazz : Class<T>):T{
return retrofit.create(clazz)
}
}
interface ApiService{
/**
* @Query(value = "userId",encoded = true)用来修饰userId:String
* */
@GET(value = "user/query")//"user/query"具体的请求地址,不需要加域名
fun queryUser(@Query(value = "userId",encoded = true) userId:String):Call<UserResponse>
}
5.3、使用
//注意:onResponse和onFailure方法都是运行在主线程中 MyRetrofit.create(ApiService::class.java) .queryUser("1600932269") .enqueue(object : Callback<UserResponse> { override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) { Log.e("retrofit", "onResponse: " + response.body()?.toString()?:"response is error" ) } override fun onFailure(call: Call<UserResponse>, t: Throwable) { Log.e("retrofit", "onFailure: " + t.message?:"unknown reason" ) } })