webentwicklung-frage-antwort-db.com.de

Wie einfach GET-Methode „Retrofit“ nennen

Es wäre schön, wenn Sie mir helfen würden, eine einfache API-GET-Methode mit Retrofit aufzurufen. Ich habe die Gson und Retrofit jar-Datei in dem Build-Pfad hinzugefügt.

Hier ist der interface:

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

Ich erhalte nur Ergebnisse (in log cat), wenn ich in AsyncTask Folgendes aufrufe, ansonsten erhalte ich NetworkOrMainThreadException Wie soll ich das aufrufen?

@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;
    }
  • Muss ich den Restadapter in AsyncTask wirklich aufrufen?
  • Wie kann ich das JsonObject aus der Antwort erhalten?
17

Retrofit gibt Ihnen die Möglichkeit, synchrone und asynchrone. Abhängig davon, wie Sie Ihre Schnittstellenmethode deklarieren, ist sie entweder synchron oder asynchron.

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

Wenn Sie Ihre API erklären synchron dann werden Sie verantwortlich davon in einem Thread Ausführung.

Bitte lesen Sie den Abschnitt "SYNCHRON VS. ASYNCHRON VS. OBSERVABLE" auf Retrofits Website . Dies erklärt Ihnen die Grundlagen zur Deklaration Ihrer APIs für Ihre unterschiedlichen Anforderungen.

Der einfachste Weg, auf Ihr JSON-Klassenobjekt zuzugreifen, besteht darin, es einem Java) -Objekt zuzuordnen und Retrofit die Konvertierung für Sie durchführen zu lassen.

Wenn zum Beispiel die zurückgegebene JSON für Ihre Rest-API war

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

Dann könnten Sie so eine Java Klasse erstellen

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

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

Dann deklarieren Sie einfach Ihre API wie folgt

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

Und es verwenden

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

        }
    });

Basierend auf dem JSON, den Sie in den Kommentaren angegeben haben, müssten Sie so etwas tun

public class MyThingResponse {
    public InnerResponse response;
}

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

Das ist etwas hässlich, aber es liegt am JSON. Meine Empfehlung wäre, Ihre JSON zu vereinfachen, indem die „Antwort“ innere Objekt zu entfernen, wenn Sie können, wie so

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

Dann könnte Ihr POJO so einfacher werden

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