android get retrofit

android - Cómo llamar al método GET simple usando "Retrofit"



(1)

Sería bueno si me ayudara a llamar a un método API GET simple utilizando Retrofit. He agregado el archivo jar Gson y Retrofit a la ruta de compilación.

Aquí está la interface :

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

Solo obtengo resultados (en log cat) si llamo a lo siguiente en AsyncTask; de lo contrario, obtengo NetworkOrMainThreadException ¿Cómo debo llamar a esto?

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

  • ¿Realmente tengo que llamar al Restadapter en AsyncTask?
  • ¿Cómo puedo obtener el objeto JsonObject de la respuesta?

El reequipamiento le da la opción de síncrono y asíncrono. Dependiendo de cómo declare su método de interfaz, será síncrono o asíncrono.

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 declara su API de forma síncrona, entonces será responsable de ejecutarlo en un Thread .

Lea la sección "SINCRÓNICO CONTRA ASINCRÓNICO CONTRA OBSERVABLE" en el website de Retrofit. Esto le explicará los conceptos básicos sobre cómo declarar sus API para sus diferentes necesidades.

La forma más sencilla de obtener acceso a su objeto de clase JSON es asignarlo a un objeto Java y dejar que Retrofit haga la conversión por usted.

Si por ejemplo el JSON devuelto para su api de descanso era

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

A continuación, podría crear una clases de Java como tal

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

Entonces simplemente declara tu API como tal

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

Y usalo

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

Basado en el JSON que has proporcionado en los comentarios que harías a algo como esto

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

Esto es un poco feo, pero es debido a la JSON. Mi recomendación sería simplificar su JSON eliminando el objeto interno de "respuesta" si puede, así

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

Entonces tu POJO podría volverse más simple así.

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