Retrofit入門学習

6416 ワード

以前、プロジェクトのフレームワークは主にretrofit、rxJava、それからmvpモードを使っていましたが、多くの場合、使うしかなく、深く理解していませんでした.今、システムの勉強をしてみましょう.まずRetrofitから、以下の内容はすべてRetrofit 2.0を主プロジェクトとして導入します.
dependencies {  
  compile 'com.squareup.retrofit2:retrofit:2.1.0'
  //            Retrofit  ,   Gson     Json   
  compile 'com.squareup.retrofit2:converter-gson:2.1.0'
}

1 Retrofitの使用
1.1 Retrofitインスタンスの作成
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://192.168.0.1:9001/")
        .build();

に注意
a.Retrofit 2のbaseUlrは/(斜線)で終わる必要があり、そうでないとIllegalArgumentExceptiondの異常bが投げ出す.http://192.168.0.1:9001?id=valuebaseUrlとしてもいいですか?id=valueはリクエスト時に失われます
1.2インタフェース形式
public interface TestAps {

    @POST(Urls.SEND_LOG_MESSAGE)
    Call sendLogMessage(@Path("id") int id);

}

インタフェースオブジェクトの作成
TestAps api=retrofit.create(TestAps.class);

ここではApiのツールクラスを作成し、オブジェクトの作成に重複コードを書かないようにすることができます.
public class ApiFactory{

    public static final String API_BASE_URL = "http://your.api-base.url";

    private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder();

    private static Retrofit.Builder builder =
            new Retrofit.Builder()
                    .baseUrl(API_BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create());

    public static  S createService(Class serviceClass) {
        Retrofit retrofit = builder.client(httpClient.build()).build();
        return retrofit.create(serviceClass);
    }
}

ここでは、自己署名証明書のhttpsアドレスを使用して証明書を設定したり、httpのリクエストヘッダ情報を設定したりすることができます.
httpClient.addInterceptor(new Interceptor() {
                @Override
                public Response intercept(Interceptor.Chain chain) throws IOException {
                    Request original = chain.request();

                    Request.Builder requestBuilder = original.newBuilder()
                        .header("Authorization", basic)
                        .header("Accept", "application/json")
                        .method(original.method(), original.body());

                    Request request = requestBuilder.build();
                    return chain.proceed(request);
                }
            });
        }

        OkHttpClient client = httpClient.build();
        Retrofit retrofit = builder.client(client).build();

1.3インタフェース要求インスタンス
Call call=api.sendLogMessage(0);

同期アクション
 try {
        ResponseBody response= call.execute().body();
    } catch (IOException e) {
        // handle errors
    }

uiスレッドのブロックを引き起こすため、同期は一般的に使用されません.特別な場合は考慮できます.
非同期操作//retrofitでシステムがメソッドに戻ってメインスレッドで実行
call.enqueue(new Callback() {
    @Override
    public void onResponse(Call call, Response response) {
        try {
            System.out.println(response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

2 Retrofitの注記
2.1要求クラス
つまりインタフェースクラス内の@POSTは主に3つの@GET getリクエスト@POSTリクエスト@Http
//method          path      hasBody        
@HTTP(method = "GET", path = "blog/{id}", hasBody = false)

@Headers固定リクエストヘッダの追加
       
public interface TestAps {
    @Headers("Cache-Control: max-age=640000")  
    @POST(Urls.SEND_LOG_MESSAGE)
    Call sendLogMessage(@Path("id") int id);

}
       
public interface TestAps {
     @Headers({  
        "Accept: application/vnd.yourapi.v1.full+json",  
        "User-Agent: Your-App-Name"  
    })   
    @POST(Urls.SEND_LOG_MESSAGE)
    Call sendLogMessage(@Path("id") int id);

}

@Header動的追加要求ヘッダ
public interface TestAps {
   
    @POST(Urls.SEND_LOG_MESSAGE)
    Call sendLogMessage(@Path("id") int id,@Header("Content-Range") String contentRange);

}

ヘッドの役割は、ApiFactoryでhttpブロッキングを使用することと同じです.
2.2タグクラス
@FormUrlEncode要求体formフォーム形式Content-Type:アプリケーション/x-www-form-urlencodedこれを使用する場合のパラメータは@Fieldまたは@FieldMapのみです
@POST(Urls.SEND_LOG_MESSAGE)
@FormUrlEncode
Call sendLogMessage(@Field("id") int id);
 @POST(Urls.SEND_LOG_MESSAGE)
  @FormUrlEncode
    Call sendLogMessage(@FieldMap Map map);

@MultipartリクエストボディサポートファイルアップロードContent-Type:multipart/form-data
 @POST("/form")
 @Multipart
 Call sendLogMessage(@Part("id") RequestBody id, @Part("age") RequestBody age, @Part MultipartBody.Part file);
  @POST("/form")
  @Multipart
  Call test(@PartMap Map args, @Part MultipartBody.Part file);

2.3パラメータクラス
非フォーム要求体@Bodyフォーム要求体@Field@FieldMapとFormUrlEncoded注記を併用@Part@PartMapとMultipart注記を併用してURL@Path@Query@QueryMap@Urlをつなぐ
@GET //  URL   ,   URL    
Call test(@Url String url);

複数のQueryパラメータに同じ名前が使用されていることに注意してください.
https://api.example.com/tasks?id=123 
public interface TestApi {  
    @GET("/tasks")
    Call getTask(@Query("id") long taskId);
}
https://api.example.com/tasks?id=123&id=124&id=125 
public interface TestApi{  
    @GET("/tasks")
    Call> getTask(@Query("id") List taskIds);
}

3導入したGsonを用いてリターン応答体タイプの変換を実現する
 Retrofit retrofit = new Retrofit.Builder()
      .baseUrl(baseUrl)
      .addConverterFactory(GsonConverterFactory.create(gson))
      .build();
public interface TestApi{
  @POST("/blog")
 Call> getBlog(@Path("id") int id);
}