Retrofit入門学習
6416 ワード
以前、プロジェクトのフレームワークは主にretrofit、rxJava、それからmvpモードを使っていましたが、多くの場合、使うしかなく、深く理解していませんでした.今、システムの勉強をしてみましょう.まずRetrofitから、以下の内容はすべてRetrofit 2.0を主プロジェクトとして導入します.
1 Retrofitの使用
1.1 Retrofitインスタンスの作成
に注意
a.Retrofit 2のbaseUlrは/(斜線)で終わる必要があり、そうでないとIllegalArgumentExceptiondの異常bが投げ出す.http://192.168.0.1:9001?id=valuebaseUrlとしてもいいですか?id=valueはリクエスト時に失われます
1.2インタフェース形式
インタフェースオブジェクトの作成
ここではApiのツールクラスを作成し、オブジェクトの作成に重複コードを書かないようにすることができます.
ここでは、自己署名証明書のhttpsアドレスを使用して証明書を設定したり、httpのリクエストヘッダ情報を設定したりすることができます.
1.3インタフェース要求インスタンス
同期アクション
uiスレッドのブロックを引き起こすため、同期は一般的に使用されません.特別な場合は考慮できます.
非同期操作//retrofitでシステムがメソッドに戻ってメインスレッドで実行
2 Retrofitの注記
2.1要求クラス
つまりインタフェースクラス内の@POSTは主に3つの@GET getリクエスト@POSTリクエスト@Http
@Headers固定リクエストヘッダの追加
@Header動的追加要求ヘッダ
ヘッドの役割は、ApiFactoryでhttpブロッキングを使用することと同じです.
2.2タグクラス
@FormUrlEncode要求体formフォーム形式Content-Type:アプリケーション/x-www-form-urlencodedこれを使用する場合のパラメータは@Fieldまたは@FieldMapのみです
@MultipartリクエストボディサポートファイルアップロードContent-Type:multipart/form-data
2.3パラメータクラス
非フォーム要求体@Bodyフォーム要求体@Field@FieldMapとFormUrlEncoded注記を併用@Part@PartMapとMultipart注記を併用してURL@Path@Query@QueryMap@Urlをつなぐ
複数のQueryパラメータに同じ名前が使用されていることに注意してください.
3導入したGsonを用いてリターン応答体タイプの変換を実現する
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);
}