Retrofit 使用笔记

在使用retrofit之前,你需要导入retrofit gsonconverter这些库。详情可以查看相关资料。https://github.com/square/retrofit ,现在出到最新的版本是2.4.0.

在retrofit之前都是用okhttp直接请求,比如

 val client = OkHttpClient()
                val body=FormBody.Builder()
                body.add("key","value")
                val request = Request.Builder()
                        .url("www.github.com")
                        .post(body.build())
                        .build()
                client.newCall(request).enqueue(object : Callback {
                    override fun onFailure(call: Call?, e: IOException?) {

                    }

                    override fun onResponse(call: Call?, response: Response?) {
                    }

                })

到了retrofit ,更加简单和gson rxjava 配合使用。

GET请求

在retrofit使用过程中,你需要定义一个接口类,比如:

interface MainService {

    @GET("/v1/home")
    fun getMain(@Query("offset") offset: Int, @Query("limit") limit: Int): Observable<MainList>
}

可以看到有个 getMain 方法,他通过 @GET 注解标记为 get 请求,@GET里面的值个 baseUrl 组成完整路径,baseUrl 在实例化 Retrofit 时赋值。

        val client =  OkHttpClient.Builder()
                .addInterceptor(loggingInterceptor)
                .addInterceptor(httpInterceptor)
                .connectTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .build();

        var retrofit =  Retrofit.Builder()
                .baseUrl(RanUrl.URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        return retrofit.create(MainService::class.java);

可以看出构建 OkHttpClient 或者是 Retrofit 的实例都用上了构造者模式, 指定了 url ,okhttpclient 和转化工厂。 最后通过 retrofit.create 返回 MainService 对象,然后调用 MainService 里面的方法

当你的请求后返回的是不是 json 格式的字符串,你也可以注册 converter-scalars 来获取到字符串。

GET请求动态url

当使用 restful 风格的 url ,就会遇到 /user/apple 这样子的请求地址,这时候你可以

interface MainService {

 @GET("user/{username}")
    fun user(@PATH("username") username:String):Observable<Response>

}

可以看到我们定义了一个 user 方法 接受一个 username 的参数,然后把 username 赋值到地址上,最后你会看到请求的是 baseurl/user/apple , 这个地址。

GET请求键值对

当你要从后台获取数据,通常要指定返回 pagesize ,第几页,�筛选key这些参数,比如:

interface MainService {

 @GET("/user")
    fun user(@Query("pageSize") pageSize:String):Observable<Response>

}

我们可以看到最后请求的地址是 baseurl/user?pageSize=1这样子。会把key value都放在地址上。而path 只会把值放在地址上。

POST一下

一般我们以表单方式 post 键值对到后台,这时候就用到 @FormUrlEncoded ,比如:

    @POST("/user")
    @FormUrlEncoded
    fun user(@FieldMap option : HashMap<String, String> ):Observable<Response>

使用的时候你要创建一个 HashMap,key 和 value 分别对应 后台需要的key 和 value。

POST一个JSON字符串

当你要post一个�json格式的字符串到服务器时,�就要用到@Body标注,

    @POST("/user")
    fun user(@Body  user : User) : Observable<Response>

这时候创建一个User的实体类,传入user方法即可。

POST一个文件

    @Multipart
    @POST("/user")
    fun user(@Part photo : MultipartBody.Part ,@Part("username") username : RequestBody ):Observable<Response> 

这时候是上传 username 的键值对和一个图片文件 MultipartBody。@Multipart 可以上传多个 @Part 文件和键值对。 使用的时候用 ,键值对用 RequestBody 包一层,图片先用 RequestBody 包一层,再用 MultiRequestBody.Part 包一层。

    val file = new File(filePath)
    val photoRequestBody = RequestBody.create(MediaType.parse("image/png"), file)
    val photo = MultipartBody.Part.createFormData("photos", "icon.png", photoRequestBody)
    val username = RquestBody.create(null, "name")
    var response = user(photo,username)

POST一堆文件

比如你今天发个朋友圈就用到这个上传一堆文件的方法了。

    @Multipart
    @POST("/user")
    fun user(@PartMap params : Map<String,RequestBody>  ,@Part("username") username : RequestBody ): Observable<Response>

这时候用到一个新注解@PartMap ,传入的是map类型,key是服务器接受的key value是包着文件的requestbody。

    val file = File("filepath")
    val photo = RequestBody.create(MediaType.parse("image/png"), file)
    val map = HashMap<String, RequestBody>()
    map["images\";filename=\"image.png"] = photo
    map["desc"] = RequestBody.create(null, "desc")
    val response = user(map,RequestBody.create(null, "name"))

以上。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏androidBlog

一步步拆解 LeakCanary

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

10910
来自专栏信安之路

ret2resolve学习笔记

一是做个总结,二是做个备份。上篇文章感谢@大米指出的错误,格式化字符串漏洞还未销声匿迹!!!

11900
来自专栏码匠的流水账

聊聊spring cloud gateway的ForwardedHeadersFilter

本文主要研究一下spring cloud gateway的ForwardedHeadersFilter

10320
来自专栏郭霖

Android图片加载框架最全解析(四),玩转Glide的回调与监听

大家好,今天我们继续学习Glide。 在上一篇文章当中,我带着大家一起深入探究了Glide的缓存机制,我们不光掌握了Glide缓存的使用方法,还通过源码分析对缓...

65360
来自专栏JAVA高级架构

适配器模式(Adapter)

10530
来自专栏進无尽的文章

简述OC语言

对于一门语言的学习是需要时间领悟的,而对于一些原理性的问题,我们需要清楚其核心思想,知其然而知其所以然,这样才能有利于自己的后续发展。本文只是简述,没有面面具到...

24320
来自专栏向治洪

picasso图片缓存框架

picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓...

33680
来自专栏小灰灰

EventBus 源码学习笔记(三)

EventBus 深入学习三之Guava小结 上一篇讲述了 EventBus 的整个执行流程, 本片则从细节处出发,探讨下设计的精妙 巧妙的利用缓存, 解决重...

25260
来自专栏Hongten

spring开发_邮箱注册_激活_获取验证码

==============================================

36130
来自专栏向治洪

Android数据库Realm实践

Android开发中常用的数据库有5个: 1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM。支持JDBC连...

26190

扫码关注云+社区

领取腾讯云代金券