Retrofit处理复杂的接口地址类型

动态的接口地址

大部分接口是动态变化。
先来回顾一下静态的接口写法

GET http:/example.com/get_data.json

静态的接口写法是比较简单的,直接如下写就可以:

interface ExampleService {  
    @GET("get_data.json")  
    fun getData(): Call<Data>  
}

动态则如

GET http://example.com/< page >/get_data.json

对于动态的page,应该这么写:

interface ExampleService {  
    @GET("{page}/get_data.json")  
    fun getData(@Path("page") page:Int): Call<Data>  
}

在注解GET中,使用了一个page的占位符,后又在getData方法中,添加了一个page参数,并且使用了PATH注解。这样当调用getData方法发送请求时,Retrofit就会自动将page参数替换到占位符中,从而组成一个合法的位置。

包含一系列参数的地址

有时候,服务器接口还会要求我们自动传入一系列的参数,格式如下:

GET http://example.com/get_data.json?u=< user >&t=< token >

这是一种标准的带参数GET请求的格式。接口会使用问号来连接参数部分,每个参数都是一个使用等号连接的键值对,多个参数之间使用“&”来连接。
在这里很显然,服务器要我们传入user和token两个参数。
对于这样子多个参数的请求地址,Retrofit提供了另一种语法来支持。

interface ExampleService {  
    @GET("get_data.json")  
    fun getData(@Query("u") user:String, @Query("t") token:String): Call<Data>  
}

@Query注解会在发起网路请求时,自动按照参数GET请求的格式将这两个参数构建到请求地址中。

其他请求方式

HTTP并不只有GET一种请求方式,还有POST、PUT、PATCH、DELETE几种
简单概括的话,POST请求用于向服务器提交数据,PUT和PATCH请求用于修改服务器上的数据,DELETE请求用于删除服务器上的数据。
而Retrofit对所有常用的请求类型都进行了支持
比如

DELETE

DELETE http://example.com/data/< id >

这个接口意味着要根据id删除一条指定的数据,而我们在Retrofit想要发出这种请求,需要这么写

interface ExampleService {  
    @DELETE("data/{id}")  
    fun getData(@Path("id") id:String):Call<ResponseBody>  
}

一些操作上面已经提到过了,这里为什么是返回一个ResponseBody呢?原因是DELETE并不需要返回数据,更多的是对数据进行一个操作,因此这时候就可以使用ResponseBody,表示可以接收任意类型的响应数据,并且不会对响应数据一个解析。

POST

如:

POST http://example.com/data/create
{“id”: 1, “content”:“The description for this data.”}

interface ExampleService {  
   @POST("data/create")  
   fun createData(@Body data:Data):Call<ResponseBody>  
}

这里的Body注解,会在发出请求的时候,f服务器自动将Data对象中的数据转换成JSON格式的文本,并且放到HTTP请求的body部分。

在请求的header中指定参数

比如

GET http://example.com/get_data.json
User-Agent: okhttp
Cache-Cotrol: max-age=0

这些header其实就是一个一个键值对
可以在Retrofit中直接使用@Header注解来声明
如下

  
interface ExampleService {  
   @Headers("User-Agent: okhttp","Cache-Control: max-age=0")  
   @GET("get_data.json")  
   fun getData():Call<Data>  
}

但是这种方法只适合静态的header,如果需要动态指定header的值,则需要使用@Header注解
(少了一个s)

  
interface ExampleService {  
   @GET("get_data.json")  
   fun getData(@Header("User-Agent")userAgent:String,  
                @Header("Cache-Control")cacheControl:String):Call<Data>  
      
}

你可能感兴趣的:(Android,retrofit)