初试Retrofit网络请求

来源:互联网 发布:风险中性概率 知乎 编辑:程序博客网 时间:2024/05/22 10:44

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请求数据  
    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);
           多个查询参数,用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);
    对象可以被配置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)



0 0