Retrofit 是大名鼎鼎的Square开源的一款适用于Android和Java的网络请求的库,其实就是对OkHttp做了一些封装。Retrofit使用注解,简化了网络请求。我们对Retrofit进行初步的使用。
1.添加依赖和权限
在 build.gradle 文件中添加依赖,在 Manifest.xml文件中添加所需的网络权限。
// build.gradle
compile 'com.squareup.retrofit:retrofit:2.0.1-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'
// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
在 Retrofit 2.0 中,如果要将 JSON 数据转化为 Java 实体类对象,需要自己显式指定一个 Gson Converter。
2.创建Java接口
public interface APIInterface {
@GET("/users/{user}")
Call<TestModel> repo(@Path("user") String user);
在后文构造 Retrofit 对象时会添加一个 baseUrl(https://api.github.com)。
在此处 GET 的意思是 发送一个 GET请求,请求的地址为:baseUrl + “/users/{user}”。
{user} 类似于占位符的作用,具体类型由 repo(@Path(“user”) String user) 指定,这里表示 {user} 将是一段字符串。
Call 是一个请求对象,表示返回结果是一个 TestModel 类型的实例。
3.Retrofit请求会将Json数据java实体类,在这里我们需要创建一个Model
public class TestModel {
private String login;
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
}
4.进行连接通信(构建Retrfit对象,建立请求链接)
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
注意这里添加的 baseUrl 和 GsonConverter,前者表示要访问的网站,后者是添加了一个转换器。
接着,创建我们的 API 接口对象,这里 APIInterface 是我们创建的接口:
APIInterface service = retrofit.create(APIInterface.class);
使用 APIInterface 创建一个『请求对象』:
Call<TestModel> model = service.repo("Guolei1130");
注意这里的 .repo(“Guolei1130”) 取代了前面的 {user}。到这里,我们要访问的地址就成了:
https://api.github.com/users/Guolei1130
可以看出这样的方式有利于我们使用不同参数访问同一个 Web API 接口,比如你可以随便改成 .repo(“ligoudan”)
最后,就可以发送请求了!
model.enqueue(new Callback<TestModel>() {
@Override
public void onResponse(Call<TestModel> call, Response<TestModel> response) {
// Log.e("Test", response.body().getLogin());
System.out.print(response.body().getLogin());
}
@Override
public void onFailure(Call<TestModel> call, Throwable t) {
System.out.print(t.getMessage());
}
});
至此,我们就利用 Retrofit 完成了一次网络请求。
——————————————————————以上只是简单的使用————————————————
Retrofit中有用到很多的注解。下图是Retrofit的各类注解。
其中,包含了与请求方法相关的 @GET、@POST、@HEAD、@PUT、@DELETA、@PATCH,和参数相关的@Path、@Field、@Multipart等。
在之前我们转换接口的时,我们是这样写的:
public interface APIInterface {
@GET("/users/{user}")
Call<TestModel> repo(@Path("user") String user);
很明显就可以看到@GET是关于一个请求的,而@Path我们用它来充当一个占位符的功能,它是参数相关的。
Header设置
当我们要设置网络请求的Header时,Retrofit提供了我们两种方法(静态配置和动态配置)。
静态配置,直接在接口中指定Header参数
@Headers({
"User-Agent: Retrofit-Sample-App"
})
动态配置,在接口中注解但不指定,后面实例化请求体时可通过 .getUser 指定 Header。
@GET("/user")
Call<TestModel> getUser(@Header("Authorization") String authorization)
GET请求参数配置
在我们发送GET请求的时候,如果需要设置GET的参数,Retrofit注解提供俩种方式来进行配置,分别是 @Query(一个键值对)和 @QueryMap(多对键值对)。
Call<TestModel> one(@Query("username") String username);
Call<TestModel> many(@QueryMap Map<String, String> params);
POST 请求参数设置
POST 的请求与 GET 请求不同,POST 请求的参数是放在请求体内的。所以当我们要为 POST 请求配置一个参数时,需要用到 @Body 注解:
Call<TestModel> post(@Body User user);
这里的 User 类型是需要我们去自定义的:
public class User {
public String username;
public String password;
public User(String username,String password){
this.username = username;
this.password = password;
}
最后在获取请求对象时:
User user = new User(“lgd”,”123456”);
Call model = service.post(user);
就能完成 POST 请求参数的发送,注意该请求参数 user 也会转化成 Json 格式的对象发送到服务器。
总结,以上就是Retrofit的一个简单地使用。谢谢!!!!