作者:续2502915941 | 来源:互联网 | 2023-09-01 13:36
Retrofit
是一个高质量高效率的HTTP请求库。Retrofit内部依赖于OkHttp,它将OKHttp底层的代码和细节都封装了起来,功能上做了更多的扩展,比如返回结果的自动解析数据模型,网络引擎的切换,拦截器…
restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的,可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。
rest请求方法有4种,包括get,post,put,delete.分别对应获取资源,添加资源,更新资源及删除资源.
作者:埋着头向前走寻找我自己
链接:https://www.jianshu.com/p/dfe3077ddbcd
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1. 注解
retrofit注解驱动型上层网络请求框架,使用注解来简化请求,大体分为以下几类:
- 用于标注网络请求方式的注解
- 标记网络请求参数的注解
- 用于标记网络请求和响应格式的注解
图片和部分文字转自https://www.songyubao.com/book/primary/network/Retrofit.html
1.1请求方法注解
注解 | 说明 |
---|
@GET | get请求 |
@POST | post请求 |
@PUT | put请求 |
@DELETE | delete请求 |
@PATCH | patch请求,该请求是对put请求的补充,用于更新局部资源 |
@HEAD | head请求 |
@OPTIONS | option请求 |
@HTTP | 通用注解,可以替换以上所有的注解,其拥有三个属性:method,path,hasBody |
1.2 请求头注解
既可以标记在方法上面也可以标记在参数里面
注解 | 说明 |
---|
@Headers | 用于添加固定请求头,可以同时添加多个。通过该注解添加的请求头不会相互覆盖,而是共同存在 |
@Header | 作为方法的参数传入,用于添加不固定值的Header,该注解会更新已有的请求头 |
1.3请求参数注解
名称 | 说明 |
---|
@Body | 多用于post请求发送非表单数据,比如想要以post方式传递json格式数据 |
@Filed | 多用于post请求中表单字段,Filed和FieldMap需要FormUrlEncoded结合使用 |
@FiledMap | 和@Filed作用一致,用于不确定表单参数 |
@Part | 用于表单字段,Part和PartMap与Multipart注解结合使用,适合文件上传的情况 |
@PartMap | 用于表单字段,默认接受的类型是Map,可用于实现多文件上传 |
@Path | 用于url中的占位符 |
@Query | 用于Get中指定参数 |
@QueryMap | 和Query使用类似 |
@Url | 指定请求路径 |
1.4请求和响应格式注解
名称 | 说明 |
---|
@FormUrlEncoded | 表示请求发送编码表单数据,每个键值对需要使用@Field注解 |
@Multipart | 表示请求发送multipart数据,需要配合使用@Part |
@Streaming | 表示响应用字节流的形式返回.如果没使用该注解,默认会把数据全部载入到内存中.该注解在在下载大文件的特别有用 |
2 开始使用
step1: 添加依赖
app/build.gradle
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
step2: 初始化
object FirstRetrofit {private val okClient:OkHttpClient &#61; OkHttpClient.Builder() .connectTimeout(10,TimeUnit.SECONDS) .readTimeout(10,TimeUnit.SECONDS) .writeTimeout(10,TimeUnit.SECONDS) .addInterceptor(LoggingInterceptor()) .build()private val retrofit:Retrofit &#61; Retrofit.Builder().client(okClient) .baseUrl("http://123.56.232.18:8080/serverdemo/") .addConverterFactory(GsonConverterFactory.create()) .build()fun <T> create(clazz: Class<T>):T{return retrofit.create(clazz)}
}
interface ApiService{&#64;GET(value &#61; "user/query")fun queryUser(&#64;Query(value &#61; "userId", encoded &#61; true) userId:String):Call<UserResponse>
}
step3:调用
异步用enqueue()&#xff0c;同步用execute()
val apiService &#61; FirstRetrofit.create(ApiService::class.java)apiService.queryUser("1600933269").enqueue(object :Callback<UserResponse>{override fun onResponse(call: Call<UserResponse>, response: Response<UserResponse>) {Log.e("Retrofit",response.body()?.toString()?:"response is null")}override fun onFailure(call: Call<UserResponse>, t: Throwable) {Log.e("Retrofit",t.message?:"unknown reason")}})
Tips:
onResponse 和 onFailure 的回调都是在主线程里面
可以直接操控UI控件
请求方法定义
interface ApiService{&#64;GET(value &#61; "user/query")fun queryUser(&#64;Query(value &#61; "userId", encoded &#61; true) userId:String):Call<UserResponse>&#64;Headers("User-Agent:android", "apikey:123456789")&#64;GET(value &#61; "user/query")fun queryUser1(&#64;Query(value &#61; "userId" , encoded &#61; true) userId: String):Call<UserResponse>&#64;GET(value &#61; "user/query")fun queryUser2(&#64;QueryMap(encoded &#61; true) queryMap: Map<String?, String?>):Call<UserResponse>&#64;POST("user/update")fun userUpdate(&#64;Body post: User):Call<UserResponse>&#64;POST()&#64;FormUrlEncodedfun executePost(&#64;FieldMap map:Map<String , User>):Call<UserResponse>&#64;Multipart&#64;FormUrlEncoded&#64;POST("upload/upload")fun register(&#64;Field("openId") openId:String,&#64;PartMap map:Map<String? , MultipartBody.Part>):Call<UserResponse>}