美文网首页
Android网络请求

Android网络请求

作者: GrayZhang | 来源:发表于2019-02-21 17:12 被阅读0次

    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<JsonObject> 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网络请求

          本文链接:https://www.haomeiwen.com/subject/brmcyqtx.html