web-dev-qa-db-fra.com

Comment appeler une méthode GET simple en utilisant "Retrofit"

Ce serait bien si vous m'aidiez à appeler une méthode API GET simple à l'aide de Retrofit. J'ai ajouté le fichier jar Gson et Retrofit au chemin de génération.

Voici le interface:

  public interface MyInterface {
        @GET("/my_api/shop_list")
        Response getMyThing(@Query("mid") String param1);
    }

J'obtiens des résultats uniquement (dans log cat) si j'appelle ce qui suit dans AsyncTask sinon j'obtiens NetworkOrMainThreadException Comment dois-je l'appeler?

@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;
    }
  • Dois-je vraiment appeler le Restadapter dans AsyncTask?
  • Comment puis-je obtenir le JsonObject de la réponse?
17
Rethinavel Pillai

Retrofit vous offre la possibilité de synchroniser et asynchrone. Selon la façon dont vous déclarez votre méthode d'interface, elle sera synchrone ou asynchrone.

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);
}

Si vous déclarez votre API de manière synchrone, vous serez responsable de son exécution dans un Thread.

Veuillez lire la section "SYNCHRONE VS ASYNCHRONE VS OBSERVABLE" sur Retrofit's site Web . Cela vous expliquera les bases sur la façon de déclarer vos API pour vos différents besoins.

Le moyen le plus simple d'accéder à votre objet de classe JSON est de le mapper à un objet Java et de laisser Retrofit effectuer la conversion pour vous.

Si, par exemple, le JSON renvoyé pour votre api de repos était

[{"id":1, "name":"item1"}, {"id":2, "name":"item2"}]

Ensuite, vous pouvez créer un Java classes comme ça

public class Item {
    public final int id;
    public final String name;

    public Item(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

Ensuite, déclarez simplement votre API comme

@GET("/my_api/shop_list")
void getMyThing(@Query("mid") String param1, Callback<List<Item>> callback);  // Asynchronous

Et l'utiliser

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) {

        }
    });

Sur la base du JSON que vous avez fourni dans les commentaires que vous auriez à faire à quelque chose comme ça

public class MyThingResponse {
    public InnerResponse response;
}

public class InnerResponse {
    public String message;
    public String status;
    public List<Item> shop_list;
}

C'est un peu moche mais c'est à cause du JSON. Ma recommandation serait de simplifier votre JSON en supprimant l'objet interne "réponse" si vous le pouvez, comme ça

{
    "message": "Shops shown",
    "status": 1,
    "shop_list": [
        {
            "id": "1",
            "city_id": "1",
            "city_name": "cbe",
            "store_name": "s"
        }
    ]
}

Ensuite, votre POJO pourrait alors devenir plus simple comme ça

public class MyThingResponse {
    public String message;
    public String status;
    public List<Item> shop_list;
}
30
Miguel Lavigne