Retrofit---学习笔记

添加网络访问权限并引入依赖库

<uses-permission android:name="android.permission.INTERNET"/>

compile 'com.squareup.retrofit2:retrofit:2.1.0'

使用注解定义网络访问的API

图片来源于网络
图片来源于网络
图片来源于网络

[下列为使用方法]


  • @GET 发送GET请求
  • @PATH 替换请求url中用花括号括起的部分
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
  • @Query 增加请求参数
    • ?sort=...
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId,@Query("sort") String sort);
  • @QueryMap 批量增加请求参数
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

Map<String,String> params =new HashMap<>();        params.put("param1","value1");
params.put("param2","value2");
Call<ResponseInfo> call = service.testHttpGet(params);
  • @POST 发送post请求
  • @Body 作为请求体发送对象(可以声明一个对象作为请求体发送到服务器)
@POST("users/new")
Call<User> createUser(@Body User user);
  • 使用@FormUrlEncoded 表明为表单提交
    • 使用@Field(注解和参数来指定每个表单项的Key,value为参数的值)表单提交的域
    • 使用@FieldMap 批量增加表单提交的域
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
  • @Header 添加头部信息
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
  • @Headers 批量添加头部信息
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

请求头不会相互覆盖,同名的请求头会被保留进请求

  • 使用@Multipart 一般用于文件上传
    • 使用 @Part(注解定义要发送的每个文件)表明不同的请求体
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

使用Retrofit生成该接口的一个实现

使用Builder构建一个Retrofit,并调用Retrofit的create方法创建一个接口实现。构建的时候需要提供baseUrl,而接口定义时使用相对路径即可。

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")//这里以/结尾
    .addConverterFactory(GsonConverterFactory.create()) //这里使用Gson转换器,需要添加相应依赖
    .build();

GitHubService service = retrofit.create(GitHubService.class);
Gson与Converter
  • 添加相应依赖: compile 'com.squareup.retrofit2:converter-gson:2.1.0'
  • 在默认情况下Retrofit只支持将Http的响应体转换为ResponseBody
  • 但如果响应体只是支持转换为ResponseBody的话何必要引用泛型呢,返回值直接用一个Call就行了
  • 既然支持泛型,那说明泛型参数可以是其它类型的,而Converter就是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型
  • 当然只改变泛型的类型是不行的,我们在创建Retrofit时需要明确告知用于将ResponseBody转换我们泛型中的类型时需要使用的Converter
自定义Gson对象

如果你需要调整json中的某些格式,例如,日期格式。 你可以通过创建一个Json对象,并将其传递给GsonConverterFactory.create()

        Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
                .create();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.nuuneoi.com/base/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();

        service = retrofit.create(APIService.class);

调用实现的方法来进行同步或异步的HTTP请求

Call<List<Repo>> repos = service.listRepos("octocat");
// 同步请求
List<Repo> repoList = repos.execute().body();
// 异步请求
repos.enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
    }
    @Override
    public void onResponse(Call call, Response response) throws IOException {
        // response.body().string();
    }
});

调用接口方法之后返回的是Call对象,可以被异步或同步执行,每个实例只能使用一次,当然可以使用clone()将会创建一个新的来用。还可以通过cancle方法取消Call

Use an Interceptor from OkHttp

在Retrofit 1.9你可以使用RequestInterceptor拦截一个请求,但它已经从Retrofit 2.0中删除,因为HTTP连接层已经移动到OkHttp。
因此,从现在开始,我们必须从OkHttp切换到Interceptor。 首先你必须创建一个带有InterceptorOkHttpClient对象

  OkHttpClient client = new OkHttpClient();
        client.interceptors().add(new Interceptor() {
            @Override
            public Response intercept(Chain chain) throws IOException {
                Response response = chain.proceed(chain.request());

                // Do anything with response here

                return response;
            }
        });
  • 并将创建的client传递给Retrofit Builder链。
       Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://api.nuuneoi.com/base/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

新的URL解析概念

New URL resolving concept

===========

学习来源

Retrofit
#Android# Retrofit使用指南
Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android


Github:Retrofit应用实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值