Retrofit的基本使用

来源:互联网 发布:图片修复软件免费版 编辑:程序博客网 时间:2024/06/05 00:34

retrofit介绍

Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton
有兴趣的可以到官网查看:
retorfit官网

retrofit使用

导包

直接build gradle里添加依赖就可以了:

//Retrofit2所需要的包
compile ‘com.squareup.retrofit2:retrofit:2.0.0-beta4’
//ConverterFactory的Gson依赖包
compile ‘com.squareup.retrofit2:converter-gson:2.0.0-beta4’
//ConverterFactory的String依赖包
compile ‘com.squareup.retrofit2:converter-scalars:2.0.0-beta4’

使用

Retrofit提供的请求方式注解有@GET和@POST,参数注解有@PATH和@Query等
详细的注解对应的解释及处理方式
可参考此文章:http://blog.csdn.net/fuhao476200/article/details/52980318

Get请求

示例:
创建RetrofitNetService业务访问接口添加如下注解:

 @GET("goods/{id}") Call<ResponseBody> getgoods(@Path("id") int id);

Call ,此处T是返回的数据类型,如知道则可填写相对应的类型,如不知则可用泛型代替,或者ResponseBody代替。
@Path用于替换Url路径中的变量字符,这里的参数id会被填充至{id}中,形成完整的Url请求地址,{id}相当于一个占位符;

示例:

    @GET("book/search")    Call<BookSearchResponse> getSearchBooks( @Query("name") String name,     @Query("tag") String tag);                                                                                   

@Query
用于拼接在Url路径后的查询参数,但相对于直接在Url后拼接,@Query则是添加一个变量:类似BaseUrl+book/search?name={name}&type={type}
推荐:
类型及对应url模式可以查看

@QueryMap与Query一样,只不过是多个参数示例:

  @GET("News")  Call<NewsBean> getItem(@QueryMap Map<String, String> map);

或者

  @GET("News")  Call<NewsBean> getItem( @Query("newsId") String newsId,@QueryMap Map<String, String> map);
post请求

@Post post请求大约有四种方式,常用的就两种,
以键值对表单提交方式:

  @FormUrlEncoded    @POST("Comments/{newsId}")    Call<Comment> reportComment(        @Path("newsId") String commentId,        @Query("access_token") String access_token,        @Field("reason") String reason);

@body类型提交方式:
RequestBody

//登入接口       @Headers({"Contenttype:application/json;charset=UTF-8"})     @POST("login")    Call<LoginReturnBean> loginApp(@Body RequestBody requestBody);    

添加header

使用注解的方式

添加一个Header参数

@Headers({"Contenttype:application/json;charset=UTF-8"})    @GET("/tasks")      Call<List<Task>> getTasks(); 
添加多个Header参数
  @Headers({          "Accept: application/vnd.yourapi.v1.full+json",          "User-Agent: Your-App-Name"      })      @GET("/tasks/{task_id}")      Call<Task> getTask(@Path("task_id") long taskId); 
动态添加Header
    @FormUrlEncoded    @POST("checkout")    Call<CheckOutResponse> checkout(@Header("userid") String userId, @FieldMap Map<String, String> params);
统一添加header

使用代码的方式,则需要使用拦截器

OkHttpClient.Builder httpClient = new OkHttpClient.Builder();    httpClient.addInterceptor(new Interceptor() {        @Override      public Response intercept(Interceptor.Chain chain) throws IOException {          Request original = chain.request();          Request request = original.newBuilder()              .header("token", "a")            .header("tokenb","b")                         .method(original.method(), original.body())              .build();          return chain.proceed(request);      }  }  OkHttpClient client = httpClient.build();    Retrofit retrofit = new Retrofit.Builder()        .baseUrl(API_BASE_URL)      .addConverterFactory(GsonConverterFactory.create())      .client(client)      .build();  

简单分装

** * @创建者 wyj * @创建时间 2017/11/8 10:22. * @描述 * @更新者 * @更新时间 2017/11/8 10:22. */public class RetrofitUtil {    private static Retrofit retrofit;    private static OkHttpClient.Builder sHttpClient;    private static OkHttpClient sClient;    /**     * @return retrofit 实例     */    public static Retrofit getRetrofitInstance() {        if (retrofit == null) {            synchronized (Retrofit.class) {                retrofit = new Retrofit.Builder()                        .baseUrl(Url.BaseUrl)                       .addConverterFactory(GsonConverterFactory.create())                        .client(getOkHttpClient())                        .build();            }        }        return retrofit;    }    private static OkHttpClient getOkHttpClient() {        if (sHttpClient == null) {            sHttpClient = new OkHttpClient.Builder();            sHttpClient.addInterceptor(new Interceptor() {                @Override                public okhttp3.Response intercept(Chain chain) throws IOException {                    Request original = chain.request();                    Request request = original.newBuilder()                            .addHeader("token","efgh")                            .addHeader("code","abcd")                            .method(original.method(), original.body())                            .build();                    return chain.proceed(request);                }            });            if (sClient == null) {                sClient = sHttpClient.build();            }        }        return  sClient;    }    /**     * @return 接口实例     */    public static RetrofitNetService getHttpServiceInstance() {         return  getRetrofitInstance().create(RetrofitNetService.class);    }}

使用方式:

 RetrofitNetService httpServiceInstance = RetrofitUtil.getHttpServiceInstance();RequestBody bod2y = RequestBody.create(MediaType.parse("application/json; charset=utf-8"),GsonTools.createGsonString(loginBody));        Call<LoginReturnBean> call = httpServiceInstance.loginApp(bod2y);   //同步请求     /*   try {            Response<LoginReturnBean> execute = call.execute();        } catch (IOException e) {            e.printStackTrace();        }*/        //异步请求        call.enqueue(new Callback<LoginReturnBean>() {           @Override           public void onResponse(Call<LoginReturnBean> call, Response<LoginReturnBean> response) {               if (response.isSuccessful()) {             LoginReturnBean body =response.body();                }           }           @Override           public void onFailure(Call<LoginReturnBean> call, Throwable t) {           }       });

关于http的一些基础知识:
http://www.jianshu.com/p/e544b7a76dac
使用方法参考文章:
http://www.jianshu.com/p/331f0bf161c2
http://www.jianshu.com/p/308f3c54abdd

原创粉丝点击