大部分接口是动态变化。
先来回顾一下静态的接口写法
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 http://example.com/data/< id >
这个接口意味着要根据id删除一条指定的数据,而我们在Retrofit想要发出这种请求,需要这么写
interface ExampleService {
@DELETE("data/{id}")
fun getData(@Path("id") id:String):Call<ResponseBody>
}
一些操作上面已经提到过了,这里为什么是返回一个ResponseBody呢?原因是DELETE并不需要返回数据,更多的是对数据进行一个操作,因此这时候就可以使用ResponseBody,表示可以接收任意类型的响应数据,并且不会对响应数据一个解析。
如:
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部分。
比如
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>
}