Retrofit——01.はじめに


RetrofitはRestful APIのHTTPネットワーク要求フレームワークのパッケージであり、ネットワーク要求の作業は本質的にOkHttpが完了し、Retrofitはネットワーク要求インタフェースのパッケージのみを担当する
注意:Restful API RESTful APIを移動してください.
手順の使用
  • Retrofitライブラリの依存を追加:
  • implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.google.code.gson:gson:2.8.5'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
    

    1つ目はRetrofit依存であり,後にgson変換が必要である.
  • は、ネットワーク要求を記述するためのインタフェース
  • を作成する.
    public interface ApiInterface {
    
        @FormUrlEncoded
        @POST("/lookup/findDictVersion.wx")
        Observable<ResultBean> getVersion(@Field("customerId") String customerId);
    
    }
    
  • 送信要求
  • Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("http://xxxx.aaaa.cn")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
    
            ApiInterface apiInterface = retrofit.create(ApiInterface.class);
            apiInterface.getVersion("")
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribeOn(Schedulers.io())
                    .subscribe(new Observer<ResultBean>() {
                        @Override
                        public void onSubscribe(Disposable d) {
                            Log.e("log","onSubscribe");
                        }
    
                        @Override
                        public void onNext(ResultBean value) {
                            Log.e("log",value.data.downUrl);
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            Log.e("log","onError");
                        }
    
                        @Override
                        public void onComplete() {
                            Log.e("log","onComplete");
                        }
                    });
    

    注記Retrofit——01.入门_第1张图片ネットワーク要求方式Retrofit——01.入门_第2张图片タグRetrofit——01.入门_第3张图片
  • @FormUrlEncodedはform-encodedを送信するデータを表し、各キー値ペアは@Filedでキー名を注釈する必要があり、その後のオブジェクトは値を提供する必要がある.
  • @Multipartはform-encodedを送信するデータ(ファイルアップロードされたシーンに適用)を表し、各キー値ペアは@Partでキー名を注釈する必要があり、その後のオブジェクトは値を提供する必要がある.
  • public interface GetRequest_Interface {
            /**
             *            (Content-Type:application/x-www-form-urlencoded)
             * Field("username")        String name  name      username   
             */
            @POST("/form")
            @FormUrlEncoded
            Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);
             
            /**
             * {@link Part}         ,{@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、    
             *   {@link okhttp3.MultipartBody.Part}   ,             ({@link okhttp3.MultipartBody.Part}              ),
             */
            @POST("/form")
            @Multipart
            Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
    
    }
    

    ネットワーク要求パラメータRetrofit——01.入门_第4张图片
  • @Header&@Headers追加リクエストヘッダ&追加不定のリクエストヘッダ
  • // @Header
    @GET("user")
    Call<User> getUser(@Header("Authorization") String authorization)
    
    // @Headers
    @Headers("Authorization: authorization")
    @GET("user")
    Call<User> getUser()
    
    //          。
    //              
    // 1.     :@Header           ,@Headers          
    // 2.     :@Header        ;@Headers     
    
  • @BodyはPost方式でカスタムデータ型をサーバに渡し、1つのMapをコミットすると@Fieldに相当するが、MapはFormBodyを通過する.Builderクラス処理はOkhttp形式に適合するフォームとなり、例えば:
  • FormBody.Builder builder = new FormBody.Builder();
    builder.add("key","value");
    
  • @Field&@FieldMap Postリクエスト送信時にリクエストを発行するフォームフィールドは、@FormUrlEncoded注記と合わせて
  • を使用します.
    public interface GetRequest_Interface {
            /**
             *            (Content-Type:application/x-www-form-urlencoded)
             * Field("username")        String name  name      username   
             */
            @POST("/form")
            @FormUrlEncoded
            Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);
    
    /**
             * Map key      
             */
            @POST("/form")
            @FormUrlEncoded
            Call<ResponseBody> testFormUrlEncoded2(@FieldMap Map<String, Object> map);
    
    }
    
  • @Part&@PartMap Postリクエスト送信時にリクエストを提出するフォームフィールドは、@Fieldとの違い:機能は同じですが、携帯するパラメータタイプがより豊富で、データストリームも含まれているので、ファイルアップロードのあるシーンに適しています.@Multipart注記と合わせて
  • を使用します.
    public interface GetRequest_Interface {
    
              /**
             * {@link Part}         ,{@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、    
             *   {@link okhttp3.MultipartBody.Part}   ,             ({@link okhttp3.MultipartBody.Part}              ),
             */
            @POST("/form")
            @Multipart
            Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
    
            /**
             * PartMap       Map    ,   {@link RequestBody }   ,
             *         ,  {@link retrofit2.Converter}  ,          {@link com.google.gson.Gson}   {@link retrofit2.converter.gson.GsonRequestBodyConverter}
             *   {@link MultipartBody.Part}      ,        @Part MultipartBody.Part 
             */
            @POST("/form")
            @Multipart
            Call<ResponseBody> testFileUpload2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);
    
            @POST("/form")
            @Multipart
            Call<ResponseBody> testFileUpload3(@PartMap Map<String, RequestBody> args);
    }
    
  • @Queryおよび@QueryMap@GETメソッドのクエリー・パラメータ(Query=Urlの'?'の後ろにあるkey-value)url=http://www.println.net/?cate=androidただし、Query=cate構成では、インタフェースメソッドにパラメータを1つ追加するだけでよい:
  •  @GET("/")    
     Call<String> cate(@Query("cate") String cate);
    
  • @Path URLアドレスのデフォルト値
  • public interface GetRequest_Interface {
    
            @GET("users/{user}/repos")
            Call<ResponseBody>  getBlog(@Path("user") String user );
            //    API :https://api.github.com/users/{user}/repos
            //       , {user}               user( @Path    )
    }
    
  • @Urlは、URL設定
  • のために要求されたURL変数を直接入力.
    public interface GetRequest_Interface {
    
            @GET
            Call<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);
           //   URL   ,@GET   URL     
           //  GET、POST...HTTP        Url ,      {@link Url}  
    
    }