初识网络通信 | 青训营笔记

128 阅读2分钟

这是我参与「第四届青训营」笔记创作活动的第5天。

Retrofit的基本设计思想

同一款应用程序中所发起的网络请求绝大多数指向的是同一个服务器域名。

服务器提供的接口通常是可以根据功能来归类的。将服务器接口合理归类能够让代码结构变得更加合理,从而提高可阅读性和可维护性。

开发者更加习惯于“调用一个接口,获取它的返回值”这样的编码方式,其实大多数人并不关心网络的具体通信细节,但是传统网络库的用法却需要编写太多网络相关的代码。

而Retrofit的用法就是基于以上几点来设计的。

Retrofit介绍

1、 添加Retrofit库的依赖
2、 创建接受服务器返回数据的类
3、 创建用于描述网络请求的接口
4、 创建Retrofit实例
5、 创建网络请求接口实例 并配置网络请求参数 6、 发送网络请求(异步 / 同步) 7、 处理服务器返回的数据

implementation 'com.squareup.retrofit2:retrofit:2.0.2'
 implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
 implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.0.2'

创建 用于描述网络请求 的接口
Retrofit将 Http请求 抽象成 Java接口:采用注解描述网络请求参数和配置网络请求参数 @GET注解的作用:采用Get方法发送网络请求

getCall() = 接收网络请求数据的方法
其中返回类型为Call<*>,*是接收数据的类(即上面定义的Translation类)
如果想直接获得Responsebody中的内容,可以定义网络请求返回值为Call

public interface GetRequest_Interface {

    @GET("openapi.do?keyfrom=abc&key=2032414398&type=data&doctype=json&version=1.1&q=car")
    Call<Reception> getCall(@Field("name") String name);
}

下一步,创建实例

 Retrofit retrofit = new Retrofit.Builder()
               .baseUrl("http://baidu.com/") //设置网络请求的Url地址
               .addConverterFactory(GsonConverterFactory.create()) //设置数据解析器
               .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
               .build();

发送同步请求或者异步请求
创建网络请求接口的实例

     // 
     GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
     //对 发送请求 进行封装
     Call<Reception> call = request.getCall("");
     call.enqueue(new Callback<Reception>() {
         //请求成功时回调
         @Override
         public void onResponse(Call<Reception> call, Response<Reception> response) {
             //请求处理,输出结果
             response.body().show();
         }
         //请求失败时候的回调
         @Override
         public void onFailure(Call<Reception> call, Throwable throwable) {
             System.out.println("连接失败");
         }
     });

       //同步请求
     try {
         Response<Reception> response = call.execute();
         response.body().show();
     } catch (IOException e) {
         e.printStackTrace();
     }