Skip to content
On this page

Retrofit 的基本用法,包括发送最简单的 GET 请求、发送表单、上传文件。

Retrofit 和 OKHttp

OKHttp 是一个纯净的 HTTP 客户端,负责底层网络操作。而 Retrofit 是在 OKHttp 之上再做一层 REST 抽象。

安装
groovy
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
使用
  1. 根据 Restful API 定义接口
  2. 配置一个 Retrofit 实例
  3. 使用 Retrofit 实例和第一步定义的接口创建 RequestServices 实例
  4. 通过 RequestServices 实例调用接口方法创建 Call 对象
  5. Call 对象通过 execute()enqueue() 发出请求
接口
kotlin
interface IDemoAPI {

    @GET("user/{id}")
    fun getUser(@Path("id") id: String, @Query("detail") detail: Boolean)

    @FormUrlEncoded
    @POST("login")
    fun login(@Field("username") username: String,
              @Field("password") password: String): Call<String>

    @Multipart
    @POST("file")
    fun upload(@Part file: MultipartBody.Part): Call<String>

    @Multipart
    @POST("files")
    fun upload(@Part files: Array<MultipartBody.Part>): Call<String>
}
创建 RequestServices 实例
kotlin
class APIGenerator {
    companion object {
        // 一定要以斜杆结尾
        private val kBaseUrl = "https://keng42.com/api/v1/" 

        private val retrofitBuilder = Retrofit.Builder()
                .baseUrl(kBaseUrl)
                .addConverterFactory(GsonConverterFactory.create()) ?:
                throw Exception("null retrofit builder")

        private val okHttpClientBuilder = OkHttpClient.Builder()

        fun <T> createAPI(apiClass: Class<T>): T {
            retrofitBuilder.client(okHttpClientBuilder.build())
            val retrofit = retrofitBuilder.build()
            return retrofit.create(apiClass)
        }
    }
}
发起请求
kotlin
// h_ttps://keng42.com/api/v1/user/0?detail=true
val demoAPI = APIGenerator.createAPI(IDemoAPI::class.java)
val call = demoAPI.getUser("0", true)
call.enqueue(object : Callback<String> {
    override fun onFailure(call: Call<String>?, t: Throwable?) {
        t?.printStackTrace()
    }

    override fun onResponse(call: Call<String>?, response: Response<String>?) {
        response?.body()
    }
})

val file = File(filePath)
val body = RequestBody.create(MediaType.parse("multipart/form-data"), file)
val form = MultipartBody.Part.createFormData("smfile", file.name, body)
demoAPI.upload(form).execute()
参考

Retrofit

JSON2POJO

全新的网络加载框架Retrofit2,上位的小三