Android网络请求

1、添加依赖库
添加retrofit、okhttp、rxjava、rxandroid、gson依赖库。
implementation'com.squareup.retrofit2:retrofit:2.0.0'
implementation'com.squareup.retrofit2:converter-gson:2.0.0'
api'com.google.code.gson:gson:2.6.1'
api'com.squareup.okhttp3:okhttp:3.2.0'
api'com.squareup.retrofit2:adapter-rxjava:2.0.0'
implementation'io.reactivex:rxjava:1.1.0'
implementation'io.reactivex:rxandroid:1.1.0'
api'com.squareup.okhttp3:logging-interceptor:3.2.0'

2、创建用于描述网络请求的接口
用动态代理动态的将该接口的注解翻译成一个http请求,最好在执行http请求。
接口中每个方法的参数都有使用注解标注,否则会报错。
public interface ApiService {
      @POST("login.html")
      Call login(@Body LoginParam param);
}

注解类型
网络请求的方法:@POST  @GET  @PUT  @DELETE  @PATH @HEAD @OPTIONS @HTTP
标记类:@FormUrlEncoded  @Multipart  @Streaming
网络请求参数:@Header @headers @URL @Body @Path @Field @FieldMap
                         @Part @PartMap  @Query @QueryMap
网络请求的完整Url = 创建Retrofit实例时通过baseUrl()设置+网络请求接口的注解设置(@POST括号后面)。
@FormUrlEncoded 表示发送form-encoded的数据,每个键值对需要用Field来注解键名,随后的对象需要提供值。
@Multipart 表示发送form-encoded的数据(适用于文件上传的场景),每个键值对用@Part来注解键名,随后的对象需要提供值。
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), filePath);
MultipartBody.Part part = MultipartBody.Part.createFormData("imgFile", filePath.getName(), requestFile);
@POST("login.html")
@Multipart
Call uploadFile(@Part  MultipartBody.Part  part);

3、创建Retrofit实例
     Retrofit retrofit =new Retrofit.Builder() ;
     retrofit.baseUrl("https://www.sojson.com/open/api/weather/") ; 
     retrofit.addConverterFactory(GsonConverterFactory.create()) ;
     retrofit.addCallAdapterFactory(RxJavaCallAdapterFactory.create());
   //设置请求Https或Http
     retrofit.client(USE_HTTPS ? generateHttpsClient(context) : getHttpClient());
    /*** 使用http方式请求网络 */
   @NonNull
    private OkHttpClientgetHttpClient() {
          okHttpClient.connectTimeout(10 , TimeUnit.SECONDS);
          return okHttpClient.build();
    }

    /**https*/ 请求
     private OkHttpClientgenerateHttpsClient(Context context) {
             try {
                 SSLSocketFactory socketFactory =new NoSSLv3SocketFactory(getSSLConfig(context,         R.raw.smartcampus).getSocketFactory());
                 okHttpClient.sslSocketFactory(socketFactory);
               }catch (IOException e) {
                      e.printStackTrace();
              }catch (CertificateException e) {
                      e.printStackTrace();
              }catch (NoSuchAlgorithmException e) {
                      e.printStackTrace();
             }catch (KeyStoreException e) {
                      e.printStackTrace();
             }catch (KeyManagementException e) {
                      e.printStackTrace();
              }
            return okHttpClient.build();
     }

4、创建请求接口实例
    ApiService apiService = retrofit.build().create(ApiService.class);

5、发送网络请求
    apiService.login(param).enqueue(new Callback() {
            @Override
             public void onResponse(Call call, Response response) {
                      if (response.isSuccessful()) {
                           LogUtil.e("member", "body==" + response.body().toString());
                           int code = response.body().get(ConfigUtil.CODE).getAsInt();
                          String message = response.body().get(ConfigUtil.MSG).getAsString();
                           if (code ==200) {
                                JsonObject jsonObject = response.body().getAsJsonObject(ConfigUtil.BODY);
                            }else {
                               ToastUtils.showToast(LoginActivity.this, message);
                         }
                   }
              dialog.dismiss();
              }

       @Override
        public void onFailure(Call call, Throwable t) {
                 dialog.dismiss();
         }
   });

RxJava
RxJava是基于事件流,实现异步操作的库。
作用:实现异步操作
特点:逻辑简洁、实现优雅(基于事件流的链式调用)、使用简单
原理:基于一种扩展的观察者模式
被观察者(Observable)通过订阅(Subscribe)按顺序发送事件(Event)给观察者(Observer),观察者按顺序接收事件并对应的相应动作。

你可能感兴趣的:(Android网络请求)