Retrofitを使用して簡単なAPI GETメソッドを呼び出すのを手伝ってくれたら嬉しいです。 GsonおよびRetrofit jarファイルをビルドパスに追加しました。
interface
は次のとおりです。
public interface MyInterface {
@GET("/my_api/shop_list")
Response getMyThing(@Query("mid") String param1);
}
AsyncTaskで次を呼び出した場合にのみ(log catで)結果が表示されます。それ以外の場合はNetworkOrMainThreadException
が表示されます。
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://IP:Port/")
.setLogLevel(RestAdapter.LogLevel.FULL).build();
MyInterface service = restAdapter
.create(MyInterface.class);
mResponse = service.getMyThing("455744");
return null;
}
Retrofitは、同期および非同期のオプションを提供します。インターフェイスメソッドの宣言方法に応じて、同期または非同期のいずれかになります。
public interface MyInterface {
// Synchronous declaration
@GET("/my_api/shop_list")
Response getMyThing1(@Query("mid") String param1);
// Asynchronous declaration
@GET("/my_api/shop_list")
void getMyThing2(@Query("mid") String param1, Callback<Response> callback);
}
APIを同期的に宣言する場合は、Thread
でAPIを実行する必要があります。
Retrofitの website の「SYNCHRONOUS VS. ASYNCHRONOUS VS. OBSERVABLE」セクションをお読みください。これにより、さまざまなニーズに合わせてAPIを宣言する方法の基本について説明します。
JSONクラスオブジェクトへのアクセスを取得する最も簡単な方法は、オブジェクトをJavaオブジェクトにマップし、Retrofitに変換を行わせることです。
たとえば、残りのAPIに対して返されたJSONが
[{"id":1, "name":"item1"}, {"id":2, "name":"item2"}]
その後、次のようなJava
クラスを作成できます。
public class Item {
public final int id;
public final String name;
public Item(int id, String name) {
this.id = id;
this.name = name;
}
}
次に、そのようにあなたのAPIを宣言するだけです
@GET("/my_api/shop_list")
void getMyThing(@Query("mid") String param1, Callback<List<Item>> callback); // Asynchronous
そしてそれを使用する
api.getMyThing("your_param_here", new Callback<List<Item>>() {
@Override
public void success(List<Item> shopList, Response response) {
// accecss the items from you shop list here
}
@Override
public void failure(RetrofitError error) {
}
});
コメントで提供したJSONに基づいて、このようなことを行う必要があります
public class MyThingResponse {
public InnerResponse response;
}
public class InnerResponse {
public String message;
public String status;
public List<Item> shop_list;
}
これはちょっといですが、JSONが原因です。私の推奨事項は、可能であれば「応答」内部オブジェクトを削除してJSONを単純化することです。
{
"message": "Shops shown",
"status": 1,
"shop_list": [
{
"id": "1",
"city_id": "1",
"city_name": "cbe",
"store_name": "s"
}
]
}
その後、POJOは次のようにシンプルになります。
public class MyThingResponse {
public String message;
public String status;
public List<Item> shop_list;
}