retrofit 由浅入深(一) 基本使用

2020-04-13  本文已影响0人  极客天空

retrofit简介

RESTful 网络请求框架的封装
网络请求的本质是OKHttp来完成,而retrofit 仅负责网络接口的封装

retrofit实例

一 retrofit的安装

我们将以JSON格式发送和接收数据,因此我们也添加了converter-gson依赖项
gradle 方式:

dependencies {
    .....
    //retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.6.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
}

在AndroidManifest.xml添加网络访问权限

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

二 REST API建模

  1. REST API 接口
    http://mock.fulingjie.com/mock/api/address.php
{
  "code": 0,
  "message": "OK",
  "data": [
    {
      "id": 1,
      "default": true,
      "name": "姓名1",
      "phone": "123456",
      "address": "地址1"
    },
    {
      "id": 2,
      "default": false,
      "name": "姓名2",
      "phone": "123456",
      "address": "地址2"
    }
  ]
}
  1. 业务数据模型
public class AddrApiResponse {
    private List<AddressBean> data;
    private String code ;
    private String message ;
    public String toString() {
        return "UserApiResponse [data=" + data.toString() + "]";
    }
}
public class AddressBean {
    private int id;
    @SerializedName("default")
    private boolean defaultX;
    private String name;
    private String phone;
    private String address;
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    public boolean isDefaultX() {
        return defaultX;
    }
    public void setDefaultX(boolean defaultX) {
        this.defaultX = defaultX;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    @Override
    public String toString() {
        return "AddressBean{" +
                "id=" + id +
                ", defaultX=" + defaultX +
                ", name='" + name + '\'' +
                ", phone='" + phone + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}
  1. 业务接口
    Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
public interface AddrService {
    @GET("/mock/api/{filename}")
    public Call<AddrApiResponse> getAddrs(@Path("filename") String filename);
}

网络请求的完整 Url =在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )


网络请求规则.png
  1. 网络请求


    网络请求1.png
  2. 标记类型


    网络请求标记.png
  3. 请求参数


    网络请求参数.png

    4.请求方法


    网络请求方法.png

三 retrofit使用

在android 4.0以后所有网络请求 不能在UI线程执行 所以同步请求网络也需要在子线程来完成

public class AddrServiceClient {
    //同步方法调用
    public void getAddrsData(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
                    Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl("http://mock.fulingjie.com/")
                            .addConverterFactory(GsonConverterFactory.create())
                            .client(httpClient.build())
                            .build();
                    AddrService service = retrofit.create(AddrService.class);
                    Call<AddrApiResponse> callSync = service.getAddrs("address.php");
                    Response<AddrApiResponse> response = callSync.execute();
                    AddrApiResponse apiResponse = response.body();
                    Log.d("rrcc",apiResponse.toString());
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        }).start();
    }
    //异步方法调用
    public void getSyncAddrs(){
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://mock.fulingjie.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .client(httpClient.build())
                .build();
        AddrService service = retrofit.create(AddrService.class);
        Call<AddrApiResponse> callSync = service.getAddrs("address.php");

        callSync.enqueue(new Callback<AddrApiResponse>() {
            //请求成功时回调
            @Override
            public void onResponse(Call<AddrApiResponse> call, Response<AddrApiResponse> response) {
                //请求处理,输出结果
                System.out.println(response.toString());
            }
            //请求失败时候的回调
            @Override
            public void onFailure(Call<AddrApiResponse> call, Throwable throwable) {
                System.out.println("连接失败");
            }
        });
    }
}

文章参考:
https://www.jianshu.com/p/865e9ae667a0
http://www.leftso.com/blog/664.html

上一篇 下一篇

猜你喜欢

热点阅读