demo:
https://github.com/anymyna/android-example-ant
Retrofit是一个网络加载框架,网络请求的是OkHttp完成,Retrofit 负责网络请求接口的封装。使用注解,简化代码量。
步骤:
1、添加依赖
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.google.code.gson:gson:2.8.6'
implementation 'com.squareup.okhttp3:logging-interceptor:4.7.2'
}
2、添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3、新建描述网络请求的接口
public interface JsonPlaceHolderApi {
@GET("posts")
Call<List<Post>> getPosts();
@GET("posts")
Call<List<Post>> getPosts(@Query("userId") int userId);
@GET("posts")
Call<List<Post>> getPosts(@Query("userId") int userId, @Query("_order") String order);
@GET("posts")
Call<List<Post>> getPosts(@Query("userId") Integer[] userId);
@GET("posts")
Call<List<Post>> getPosts(@QueryMap Map<String, String> params);
@GET("posts/{id}/comments")
Call<List<Comment>> getComments(@Path("id") int postId);
@GET
Call<List<Comment>> getComments(@Url String url);
@POST("posts")
Call<Post> createPost(@Body Post post);
@FormUrlEncoded
@POST("posts")
Call<Post> createPost(
@Field("userId") int userId,
@Field("title") String title,
@Field("body") String body
);
@FormUrlEncoded
@POST("posts")
Call<Post> createPost(@FieldMap Map<String, String> fields);
@PUT("posts/{id}")
Call<Post> putPost(@Path("id") int id, @Body Post post);
@PATCH("posts/{id}")
Call<Post> patchPost(@Path("id") int id, @Body Post post);
@DELETE("posts/{id}")
Call<Void> deletePost(@Path("id") int id);
}
4、创建返回数据类型
public class Post {
private int userId;
private int id;
private String title;
private String body;
public Post(int userId, String title, String body) {
this.userId = userId;
this.title = title;
this.body = body;
}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
@Override
public String toString() {
return "Post{" +
"userId=" + userId +
", id=" + id +
", title='" + title + '\'' +
", body='" + body + '\'' +
'}';
}
}
}
5、创建Retrofit对象和网络请求接口实例
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@NotNull
@Override
public okhttp3.Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request().newBuilder()
.header("Interceptor-Header", "456")
.build();
return chain.proceed(request);
}
})
.addInterceptor(loggingInterceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
}
6、发起网络请求
private void getPosts() {
Call<List<Post>> call = jsonPlaceHolderApi.getPosts();
call.enqueue(new Callback<List<Post>>() {
@Override
public void onResponse(Call<List<Post>> call, Response<List<Post>> response) {
if (!response.isSuccessful()) {
textView.setText("Code:" + response.code());
return;
}
List<Post> list = response.body();
for (Post post : list) {
textView.append(post.toString() + "\n");
}
}
@Override
public void onFailure(Call<List<Post>> call, Throwable t) {
textView.setText(t.getMessage());
}
});
}
}