android Retrofit 官方用例

本文介绍如何使用Retrofit将HTTP API转化为Java接口,包括请求方式、URL操作、请求体及表单数据处理等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一部分.简介

Retrofit将你的HTTP API转变为Java接口

public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
Retrofit 类生成一个实现 GitHubService接口的对象


Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

来源于GitHubService的实现类的每一个Call类对象都能向远程服务端发起一个同步或者异步的请求

Call<List<Repo>> repos = service.listRepos("octocat");

使用注解描述HTTP请求

a.url参数替换和查询参数支持;

b. 对象转换为请求体(例如,JSON);

c.多部分请求和文件上传.

第二部分:API

接口(如上面的GitHubService)中方法的参数和注解表明改请求的处理方法

1.请求方式

每一个方法必须有一个HTTP注解以便给请求提供相对url,现在有5种自带的注解:GET, POST, PUT, DELETE, 以及 HEAD,相对url参数限定在注解中

@GET("users/list")

您还可以在“网址”中指定查询参数

@GET("users/list?sort=desc")

2.url相关操作

一个请求URL可以通过替换url中的一部分或者参数来动态更新,被替换的部分应该是字母数字,并且用{ }包裹起来,需要传进去的相应的参数需要用@Path注解以及保持和上面注解的字符串一致

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

查询参数可以直接在后面添加

GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

复杂的请求参数可以使用一个Map

@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

3.请求体

一个对象可以使用@Body指定为HTTP请求体

@POST("users/new")
Call<User> createUser(@Body User user);

4.表单数据和多重数据

方法也可以发送表单数据和上传文件

表单数据发送条件:方法前面加了@FormUrlEncoded注解,每一个键值对用@Field注解

@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

多重数据请求的条件:方法前面使用@Multipart注解,每部分用@Part注解

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

5.请求头

你可以用@Headers注解设置静态的请求头

@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();

@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

记住请求头互相之间不会重写,相同名称的请求头会被汇总到请求中

请求头可以通过使用@Header注解动态配置,相应的参数必须要用@Header注解,如果值是空的,请求头会被忽略。

@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

如果你的每个请求都需要一个相同的请求头,你可以在 OkHttp interceptor中配置

鄙人才疏学浅,希望大家多多指教!有翻译的不好的地方,还原指正!!!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值