web-dev-qa-db-ja.com

「Retrofit」を使用して簡単なGETメソッドを呼び出す方法

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;
    }
  • AsyncTaskでRestadapterを実際に呼び出す必要がありますか?
  • 応答からJsonObjectを取得するにはどうすればよいですか?
17

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;
}
30
Miguel Lavigne