1、Retrofit的简单介绍:
Retrofit是Square提供的开源框架,GitHub上的描述:Type-safe HTTP client for Android and Java by Square。采用注解,提供JSON TO POJO(简单java对象Plain Ordinary Java Object),POJO TO JSON,网络请求(GET,POST,DELETE,PUT等)的封装。
2、具体实现:
1、创建项目,添加Retrofit库:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}
这里注意:
1.上面的红色背景的依赖包,不要忘了,GitHub上的Retrofit的api里是没有加这个依赖包的,如果按照官网的api不加 converter-gson依赖包,如果想用GsonConverterFactory(gson来将json转为POJO)是编译不通过的
2.添加网络权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
2、创建请求接口
public interface GitApi {
@GET("users/{user}")
public Call<GitBeanUser> getGitUser(@Path("user") String user);
}
采用@Get注解,表明get请求的方式,而且是动态path,users/{user},{user}由注解@Path指定具体内容,Call<GitBeanUser>里的GitBeanUser是请求json返回之后,通过GsonConverterFactory转化为的Pojo对象
3、创建Pojo对象GitBeanUser
public class GitBeanUser {
private String login;
private String id;
private String avatar_url;
private String gravatar_id;
private String url;
private String html_url;
private String followers_url;
private String following_url;
private String gists_url;
private String starred_url;
private String subscriptions_url;
private String organizations_url;
private String repos_url;
private String events_url;
private String received_events_url;
private String type;
private String site_admin;
private String name;
private String company;
private String blog;
private String location;
private String email;
private String hireable;
private String bio;
private String public_repos;
private String public_gists;
private String followers;
private String following;
private String created_at;
private String updated_at;
}
4、测试:创建Call请求数据
多个查询参数,用map集合public void getGitData(View view){ Log.e("onclickListener", "点击事件"); Retrofit retrofit = new Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFactory.create()) .build(); GitApi gitApi = retrofit.create(GitApi.class); Call<GitBeanUser> call = gitApi.getGitUser("octocat"); call.enqueue(new Callback<GitBeanUser>() { @Override public void onResponse(Call<GitBeanUser> call, Response<GitBeanUser> response) { Log.e("getGitUser>>>>>", response.body().toString()); } @Override public void onFailure(Call<GitBeanUser> call, Throwable t) { Log.e("getGitUser>>>>>>>", "not success"); } }); }
3、请求方法,可以看下官方api
java接口里的每个Http请求方法,必须有一个Http注解和一个关联的url,Retrofit默认提供以下5中请求方式GET,POST,PUT,DELETE,HEAD,关联的url的一些请求参数可以在不同的注解之中配置
1.直接配置固定url,不能动态改变
@GET("users/list"):无请求参数
@GET("users/list?sort=desc"):在url后直接拼接参数
2.动态配置url,并添加参数
请求的url可以动态的用代替的模块和方法中的参数去替换,一些url中需要动态配置的path或者动态改变请求参数
url中需要动态改变的部分path可以用{and}大括号包起来,而对应的参数必须用@Path(and)注解标识,并且url的
{}里的String与@Path(“and”)必须一样:
@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);
@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);对象可以被配置Retrofit对象时的POJO转化器,做相应的转化,如果Retrofit对象没有添加任何的Converter时,只能使用RequestBody,不能使用对象。
4.表单
使用post提交表单数据,可以用@FormUrlEncoded注解来标识,方法用@Post("url")来标识,每个键值对,采用@Field(”key“)String value来标识
@FormUrlEncoded @POST("user/edit") Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
5.请求头
用@Headers注解,来为请求方法配置请求头
@Headers("Cache-Control: max-age=640000") @GET("widget/list") Call<List<Widget>> widgetList();多个header参数,用{ }包起来
@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的值,对应的header参数必须在@Header("key”)之中提供,如果对应的header参数的value是null,那么这个header键值对将被忽略,否则,value的toString方法将被调用,结果作为该header参数对应的value值
@GET("user") Call<User> getUser(@Header("Authorization") String authorization)