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