Android
レトロフィット2
サーチ…
前書き
公式のRetrofitのページでは、
AndroidおよびJava用の型保証されたRESTクライアント。
Retrofitを使用すると、REST APIがJavaインターフェイスに変わります。注釈を使用してHTTP要求を記述し、URLパラメータの置換とクエリパラメータのサポートはデフォルトで統合されています。さらに、マルチパートリクエスト本体およびファイルアップロードのための機能を提供します。
備考
改造ライブラリの依存関係:
公式文書から:
Gradle:
dependencies {
...
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:retrofit:2.3.0'
...
}
Maven:
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
<version>2.3.0</version>
</dependency>
シンプルなGETリクエスト
JSON
オブジェクトまたはJSON
配列で応答するAPIに対してGET
リクエストを行う方法を示します。最初に行うことは、モジュールのGSON
ファイルにGSON
とGSON
Converterの依存関係を追加することです。
「備考」セクションで説明されているように、レトロフィットライブラリの依存関係を追加します。
期待されるJSONオブジェクトの例:
{
"deviceId": "56V56C14SF5B4SF",
"name": "Steven",
"eventCount": 0
}
JSON配列の例:
[
{
"deviceId": "56V56C14SF5B4SF",
"name": "Steven",
"eventCount": 0
},
{
"deviceId": "35A80SF3QDV7M9F",
"name": "John",
"eventCount": 2
}
]
対応するモデルクラスの例:
public class Device
{
@SerializedName("deviceId")
public String id;
@SerializedName("name")
public String name;
@SerializedName("eventCount")
public int eventCount;
}
@SerializedName
ここでの注釈からですGSON
ライブラリと私たちがすることができますserialize
とdeserialize
にこのクラスをJSON
キーとしてシリアル化された名前を使用して。これで、実際にサーバーからデータをフェッチするAPIのインターフェイスを構築できます。
public interface DeviceAPI
{
@GET("device/{deviceId}")
Call<Device> getDevice (@Path("deviceId") String deviceID);
@GET("devices")
Call<List<Device>> getDevices();
}
かなりコンパクトな場所にたくさんありますので、それを分解しましょう:
-
@GET
注釈は@GET
から提供され、GETリクエストを定義していることをライブラリに伝えます。 - カッコ内のパスは、GETリクエストがヒットするエンドポイントです(ベースURLを少し後に設定します)。
- 中括弧は実行時にパスの一部を置き換えて引数を渡すことができます。
- 定義している関数は
getDevice
と呼ばれ、必要なデバイスIDを引数としてとります。 -
@PATH
アノテーションは、この引数がパス内の "deviceId"プレースホルダを置き換える必要があることをRetrofitに通知します。 - この関数は、
Device
型のCall
オブジェクトを返します。
ラッパークラスの作成:
今度は、Retrofit初期化コードをうまくまとめたままにするために、API用の少しラッパークラスを作成します。
public class DeviceAPIHelper
{
public final DeviceAPI api;
private DeviceAPIHelper ()
{
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.addConverterFactory(GsonConverterFactory.create())
.build();
api = retrofit.create(DeviceAPI.class);
}
}
このクラスは、GSONインスタンスを作成してJSONレスポンスを解析し、ベースURLとGSONConverterでRetrofitインスタンスを作成し、APIのインスタンスを作成します。
APIの呼び出し:
// Getting a JSON object
Call<Device> callObject = api.getDevice(deviceID);
callObject.enqueue(new Callback<Response<Device>>()
{
@Override
public void onResponse (Call<Device> call, Response<Device> response)
{
if (response.isSuccessful())
{
Device device = response.body();
}
}
@Override
public void onFailure (Call<Device> call, Throwable t)
{
Log.e(TAG, t.getLocalizedMessage());
}
});
// Getting a JSON array
Call<List<Device>> callArray = api.getDevices();
callArray.enqueue(new Callback<Response<List<Device>>()
{
@Override
public void onResponse (Call<List<Device>> call, Response<List<Device>> response)
{
if (response.isSuccessful())
{
List<Device> devices = response.body();
}
}
@Override
public void onFailure (Call<List<Device>> call, Throwable t)
{
Log.e(TAG, t.getLocalizedMessage());
}
});
これは、我々のAPIインターフェースを使用してCall<Device>
オブジェクトを作成し、それぞれCall<List<Device>>
を作成します。 enqueue
呼び出すとenqueue
はバックグラウンドスレッドでその呼び出しを行い、ここで作成しているコールバックに結果を返します。
注意:プリミティブオブジェクト( String、Integer、Boolean 、 Doubleなど )のJSON配列の解析は、JSON配列の解析と似ています。しかし、独自のモデルクラスは必要ありません。 Call<List<String>>
戻り値の型をCall<List<String>>
として持つなど、 Call<List<String>>
の配列を取得できます。
Retrofit2にログを追加する
改造要求は、インタセプターを使用して記録できます。利用可能な詳細レベルは、NONE、BASIC、HEADERS、BODYです。 ここのGithubプロジェクトを参照してください。
- build.gradleに依存関係を追加する:
compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'
- Retrofitの作成時にロギングインターセプタを追加する:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(LoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.addInterceptor(loggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
ターミナル(Androidモニター)にログを公開することは、リリース版では避けておくべきことです。これは、Authトークンなどの重要な情報が暴露される可能性があるためです。
実行時にログが公開されないようにするには、次の条件を確認してください
if(BuildConfig.DEBUG){
//your interfector code here
}
例えば:
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
if(BuildConfig.DEBUG){
//print the logs in this case
loggingInterceptor.setLevel(LoggingInterceptor.Level.BODY);
}else{
loggingInterceptor.setLevel(LoggingInterceptor.Level.NONE);
}
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.addInterceptor(loggingInterceptor)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
マルチパート経由でファイルをアップロードする
Retrofit2アノテーションを使用してインタフェースを宣言します。
public interface BackendApiClient {
@Multipart
@POST("/uploadFile")
Call<RestApiDefaultResponse> uploadPhoto(@Part("file\"; filename=\"photo.jpg\" ") RequestBody photo);
}
RestApiDefaultResponse
はレスポンスを含むカスタムクラスです。
APIの実装を構築し、呼び出しをエンキューします。
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://<yourhost>/")
.client(okHttpClient)
.build();
BackendApiClient apiClient = retrofit.create(BackendApiClient.class);
RequestBody reqBody = RequestBody.create(MediaType.parse("image/jpeg"), photoFile);
Call<RestApiDefaultResponse> call = apiClient.uploadPhoto(reqBody);
call.enqueue(<your callback function>);
OkHttpインターセプタを使用した更新
この例は、リクエストインターセプタをOkHttpとともに使用する方法を示しています。これには、以下のような多くのユースケースがあります。
- 要求に汎用
header
を追加する。例えば要求を認証する - ネットワークアプリケーションのデバッグ
- 生の
response
取得する - ネットワーク取引等のロギング
- カスタムユーザーエージェントを設定する
Retrofit.Builder builder = new Retrofit.Builder()
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api.github.com/");
if (!TextUtils.isEmpty(githubToken)) {
// `githubToken`: Access token for GitHub
OkHttpClient client = new OkHttpClient.Builder().addInterceptor(new Interceptor() {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Request newReq = request.newBuilder()
.addHeader("Authorization", format("token %s", githubToken))
.build();
return chain.proceed(newReq);
}
}).build();
builder.client(client);
}
return builder.build().create(GithubApi.class);
詳細については、 OkHttpトピックを参照してください。
ヘッダと本文:認証の例
@Header
アノテーションと@Body
アノテーションはメソッドシグネチャに配置でき、 @Header
モデルに基づいてアノテーションを自動的に作成します。
public interface MyService {
@POST("authentication/user")
Call<AuthenticationResponse> authenticateUser(@Body AuthenticationRequest request, @Header("Authorization") String basicToken);
}
AuthenticaionRequestは、サーバーが必要とする情報を含む私たちのモデル、POJOです。この例では、サーバーはクライアントの鍵と秘密鍵を要求しています。
public class AuthenticationRequest {
String clientKey;
String clientSecret;
}
@Header("Authorization")
、Authorizationヘッダーを設定することを指定しています。 Retrofitは、送信しているオブジェクトの種類に基づいてレトロフィットが推測できるため、自動的に他のヘッダーが挿入されます。
どこかでRetrofitサービスを作成します。 HTTPSを使用していることを確認します。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https:// some example site")
.client(client)
.build();
MyService myService = retrofit.create(MyService.class)
その後、私たちのサービスを利用することができます。
AuthenticationRequest request = new AuthenticationRequest();
request.setClientKey(getClientKey());
request.setClientSecret(getClientSecret());
String basicToken = "Basic " + token;
myService.authenticateUser(request, basicToken);
Retrofitをマルチパートとして使用して複数のファイルをアップロードする
プロジェクトにRetrofit環境をセットアップしたら、Retrofitを使用して複数のファイルをアップロードする方法を示す次の例を使用できます。
private void mulipleFileUploadFile(Uri[] fileUri) {
OkHttpClient okHttpClient = new OkHttpClient();
OkHttpClient clientWith30sTimeout = okHttpClient.newBuilder()
.readTimeout(30, TimeUnit.SECONDS)
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(API_URL_BASE)
.addConverterFactory(new MultiPartConverter())
.client(clientWith30sTimeout)
.build();
WebAPIService service = retrofit.create(WebAPIService.class); //here is the interface which you have created for the call service
Map<String, okhttp3.RequestBody> maps = new HashMap<>();
if (fileUri!=null && fileUri.length>0) {
for (int i = 0; i < fileUri.length; i++) {
String filePath = getRealPathFromUri(fileUri[i]);
File file1 = new File(filePath);
if (filePath != null && filePath.length() > 0) {
if (file1.exists()) {
okhttp3.RequestBody requestFile = okhttp3.RequestBody.create(okhttp3.MediaType.parse("multipart/form-data"), file1);
String filename = "imagePath" + i; //key for upload file like : imagePath0
maps.put(filename + "\"; filename=\"" + file1.getName(), requestFile);
}
}
}
}
String descriptionString = " string request";//
//hear is the your json request
Call<String> call = service.postFile(maps, descriptionString);
call.enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call,
Response<String> response) {
Log.i(LOG_TAG, "success");
Log.d("body==>", response.body().toString() + "");
Log.d("isSuccessful==>", response.isSuccessful() + "");
Log.d("message==>", response.message() + "");
Log.d("raw==>", response.raw().toString() + "");
Log.d("raw().networkResponse()", response.raw().networkResponse().toString() + "");
}
@Override
public void onFailure(Call<String> call, Throwable t) {
Log.e(LOG_TAG, t.getMessage());
}
});
}
public String getRealPathFromUri(final Uri uri) { // function for file path from uri,
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && DocumentsContract.isDocumentUri(mContext, uri)) {
// ExternalStorageProvider
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/" + split[1];
}
}
// DownloadsProvider
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
final Uri contentUri = ContentUris.withAppendedId(
Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
return getDataColumn(mContext, contentUri, null, null);
}
// MediaProvider
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[]{
split[1]
};
return getDataColumn(mContext, contentUri, selection, selectionArgs);
}
}
// MediaStore (and general)
else if ("content".equalsIgnoreCase(uri.getScheme())) {
// Return the remote address
if (isGooglePhotosUri(uri))
return uri.getLastPathSegment();
return getDataColumn(mContext, uri, null, null);
}
// File
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;
}
以下はインターフェイスです
public interface WebAPIService {
@Multipart
@POST("main.php")
Call<String> postFile(@PartMap Map<String,RequestBody> Files, @Part("json") String description);
}
Retrofit2を使用してサーバーからファイルをダウンロードする
ファイルをダウンロードするためのインタフェース宣言
public interface ApiInterface {
@GET("movie/now_playing")
Call<MovieResponse> getNowPlayingMovies(@Query("api_key") String apiKey, @Query("page") int page);
// option 1: a resource relative to your base URL
@GET("resource/example.zip")
Call<ResponseBody> downloadFileWithFixedUrl();
// option 2: using a dynamic URL
@GET
Call<ResponseBody> downloadFileWithDynamicUrl(@Url String fileUrl);
}
オプション1は、固定URLを持つサーバーからファイルをダウンロードするために使用されます。オプション2を使用して動的URLを完全なURLとして要求呼び出しに渡します。これは、ユーザーや時間などのパラメータに依存するファイルをダウンロードするときに役立ちます。
api呼び出しのためのセットアップの改良
public class ServiceGenerator {
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> S createService(Class<S> serviceClass){
Retrofit retrofit = builder.client(httpClient.build()).build();
return retrofit.create(serviceClass);
}
}
今、サーバーからファイルをダウンロードするためのAPIを実装する
private void downloadFile(){
ApiInterface apiInterface = ServiceGenerator.createService(ApiInterface.class);
Call<ResponseBody> call = apiInterface.downloadFileWithFixedUrl();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
if (response.isSuccessful()){
boolean writtenToDisk = writeResponseBodyToDisk(response.body());
Log.d("File download was a success? ", String.valueOf(writtenToDisk));
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
そして、コールバックで応答を得た後、ファイルをディスクに保存するための標準IOをコーディングします。ここにコードです:
private boolean writeResponseBodyToDisk(ResponseBody body) {
try {
// todo change the file location/name according to your needs
File futureStudioIconFile = new File(getExternalFilesDir(null) + File.separator + "Future Studio Icon.png");
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
inputStream = body.byteStream();
outputStream = new FileOutputStream(futureStudioIconFile);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
Log.d("File Download: " , fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return true;
} catch (IOException e) {
return false;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} catch (IOException e) {
return false;
}
}
ResponseBodyを戻り値の型として指定したことに注意してください。そうしないと、Retrofitは解析して変換しようとしますが、これはファイルのダウンロード時には意味がありません。
あなたがRetrofitのものをもっと必要とするなら、非常に便利なので、このリンクを手に入れました。 [1]: https : //futurestud.io/blog/retrofit-getting-started-and-android-client
Stethoによるデバッグ
アプリケーションに次の依存関係を追加します。
compile 'com.facebook.stetho:stetho:1.5.0'
compile 'com.facebook.stetho:stetho-okhttp3:1.5.0'
ApplicationクラスのonCreate
メソッドで、以下を呼び出します。
Stetho.initializeWithDefaults(this);
あなたの作成するときにRetrofit
インスタンスを、カスタムOkHttpインスタンスを作成します。
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
clientBuilder.addNetworkInterceptor(new StethoInterceptor());
次に、このカスタムOkHttpインスタンスをRetrofitインスタンスに設定します。
Retrofit retrofit = new Retrofit.Builder()
// ...
.client(clientBuilder.build())
.build();
今すぐお使いの携帯電話をコンピュータに接続し、アプリを起動chrome://inspect
て、Chromeブラウザに「 chrome://inspect
と入力します。あなたが点検するためのネットワークの改装が今すぐ表示されるはずです。
2つのカスタムXmlコンバータを改造
build.gradleファイルへの依存関係の追加
dependencies {
....
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile ('com.thoughtworks.xstream:xstream:1.4.7') {
exclude group: 'xmlpull', module: 'xmlpull'
}
....
}
その後、Converter Factoryを作成します。
public class XStreamXmlConverterFactory extends Converter.Factory {
/** Create an instance using a default {@link com.thoughtworks.xstream.XStream} instance for conversion. */
public static XStreamXmlConverterFactory create() {
return create(new XStream());
}
/** Create an instance using {@code xStream} for conversion. */
public static XStreamXmlConverterFactory create(XStream xStream) {
return new XStreamXmlConverterFactory(xStream);
}
private final XStream xStream;
private XStreamXmlConverterFactory(XStream xStream) {
if (xStream == null) throw new NullPointerException("xStream == null");
this.xStream = xStream;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if (!(type instanceof Class)) {
return null;
}
Class<?> cls = (Class<?>) type;
return new XStreamXmlResponseBodyConverter<>(cls, xStream);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
if (!(type instanceof Class)) {
return null;
}
return new XStreamXmlRequestBodyConverter<>(xStream);
}
}
本文要求を処理するクラスを作成します。
final class XStreamXmlResponseBodyConverter <T> implements Converter<ResponseBody, T> {
private final Class<T> cls;
private final XStream xStream;
XStreamXmlResponseBodyConverter(Class<T> cls, XStream xStream) {
this.cls = cls;
this.xStream = xStream;
}
@Override
public T convert(ResponseBody value) throws IOException {
try {
this.xStream.processAnnotations(cls);
Object object = this.xStream.fromXML(value.byteStream());
return (T) object;
}finally {
value.close();
}
}
}
ボディレスポンスを処理するクラスを作成します。
final class XStreamXmlRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/xml; charset=UTF-8");
private static final String CHARSET = "UTF-8";
private final XStream xStream;
XStreamXmlRequestBodyConverter(XStream xStream) {
this.xStream = xStream;
}
@Override
public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
try {
OutputStreamWriter osw = new OutputStreamWriter(buffer.outputStream(), CHARSET);
xStream.toXML(value, osw);
osw.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
}
ですから、この時点でXMLを送受信できます。エンティティに対してXStreamアノテーションを作成するだけで済みます。
次に、Retrofitインスタンスを作成します。
XStream xs = new XStream(new DomDriver());
xs.autodetectAnnotations(true);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.addConverterFactory(XStreamXmlConverterFactory.create(xs))
.client(client)
.build();
GSONを使った簡単なPOSTリクエスト
サンプルJSON:
{
"id": "12345",
"type": "android"
}
あなたの要求を定義する:
public class GetDeviceRequest {
@SerializedName("deviceId")
private String mDeviceId;
public GetDeviceRequest(String deviceId) {
this.mDeviceId = deviceId;
}
public String getDeviceId() {
return mDeviceId;
}
}
サービスを定義する(ヒットするエンドポイント):
public interface Service {
@POST("device")
Call<Device> getDevice(@Body GetDeviceRequest getDeviceRequest);
}
ネットワーククライアントのシングルトンインスタンスを定義します。
public class RestClient {
private static Service REST_CLIENT;
static {
setupRestClient();
}
private static void setupRestClient() {
// Define gson
Gson gson = new Gson();
// Define our client
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://example.com/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
REST_CLIENT = retrofit.create(Service.class);
}
public static Retrofit getRestClient() {
return REST_CLIENT;
}
}
デバイスの単純なモデルオブジェクトを定義する:
public class Device {
@SerializedName("id")
private String mId;
@SerializedName("type")
private String mType;
public String getId() {
return mId;
}
public String getType() {
return mType;
}
}
デバイスの要求を処理するコントローラを定義する
public class DeviceController {
// Other initialization code here...
public void getDeviceFromAPI() {
// Define our request and enqueue
Call<Device> call = RestClient.getRestClient().getDevice(new GetDeviceRequest("12345"));
// Go ahead and enqueue the request
call.enqueue(new Callback<Device>() {
@Override
public void onSuccess(Response<Device> deviceResponse) {
// Take care of your device here
if (deviceResponse.isSuccess()) {
// Handle success
//delegate.passDeviceObject();
}
}
@Override
public void onFailure(Throwable t) {
// Go ahead and handle the error here
}
});
Retrofit 2でXMLフォームのURLを読む
レトロフィット2とSimpleXmlConverterを使用して、urlからxmlデータを取得し、Javaクラスに解析します。
依存関係をGradleスクリプトに追加する:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-simplexml:2.1.0'
インターフェイスの作成
また、私たちのケースのRssクラスにxmlクラスラッパーを作成する
public interface ApiDataInterface{
// path to xml link on web site
@GET (data/read.xml)
Call<Rss> getData();
}
XML読み込み関数
private void readXmlFeed() {
try {
// base url - url of web site
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(http://www.google.com/)
.client(new OkHttpClient())
.addConverterFactory(SimpleXmlConverterFactory.create())
.build();
ApiDataInterface apiService = retrofit.create(ApiDataInterface.class);
Call<Rss> call = apiService.getData();
call.enqueue(new Callback<Rss>() {
@Override
public void onResponse(Call<Rss> call, Response<Rss> response) {
Log.e("Response success", response.message());
}
@Override
public void onFailure(Call<Rss> call, Throwable t) {
Log.e("Response fail", t.getMessage());
}
});
} catch (Exception e) {
Log.e("Exception", e.getMessage());
}
}
これはSimpleXMLアノテーションを持つJavaクラスの例です
@Root (name = "rss")
public class Rss
{
public Rss() {
}
public Rss(String title, String description, String link, List<Item> item, String language) {
this.title = title;
this.description = description;
this.link = link;
this.item = item;
this.language = language;
}
@Element (name = "title")
private String title;
@Element(name = "description")
private String description;
@Element(name = "link")
private String link;
@ElementList (entry="item", inline=true)
private List<Item> item;
@Element(name = "language")
private String language;