2 @path Vs @query nachrüsten


74

Ich bin neu in der Nachrüstung von 2-Bibliotheken. Ich habe mehrere Artikel gelesen, um als Anfänger zu beginnen, und es ist mir gelungen, XML-Daten von meiner RESTful-API abzurufen, ohne Parameter anzugeben. Meine Methode, die die XML-Ressource generiert hat, ist unten aufgeführt.

@GET
@Path("/foods")
@Produces(MediaType.APPLICATION_XML)
public List<FoodPyramid> getFoodPyramid() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    trans = session.beginTransaction();
    List<FoodPyramid> foodList = session.createQuery("from FoodPyramid").list();
    try {
        trans.commit();
        session.close();
    } catch (Exception e) {
        session.close();
        System.err.println("Food Pyramid fetch " + e);
    }
    System.err.println("Am in the food modal. . . . . . . .");
    return foodList;
}

Nun, als ich versuchte, Parameter in der Schnittstelle zu übergeben

@GET("user/{username}/{password}")
Call<List<UserCredentail>> getUserOuth(@Query("username") String username, @Query("password") String password);  

Es konnte nicht ausgeführt werden, es wurden keine Daten von einem Client empfangen. Es dauerte eine Woche, bis ich versuchte, das Problem zu beheben, indem ich die Ressourcen mithilfe eines Nicht-Parameter-Aufrufs abrief. Also versuchte ich es zu ändern in:

@GET("user/{username}/{password}")
Call<List<UserCredentail>> getUserOuth(@Path("username") String username, @Path("password") String password);  

und es hat gut funktioniert. Meine Frage lautet also: Wann muss ich @Queryund @PathAnnotation in Retrofit 2 verwenden?

Antworten:


196

Bedenken Sie, dass dies die URL ist:

www.app.net/api/searchtypes/862189/filters?Type=6&SearchText=School

Das ist der Ruf:

@GET("/api/searchtypes/{Id}/filters")
Call<FilterResponse> getFilterList(
          @Path("Id") long customerId,
          @Query("Type") String responseType,
          @Query("SearchText") String searchText
);

Also haben wir:

www.app.net/api/searchtypes/{Path}/filters?Type={Query}&SearchText={Query}

Dinge, die nach dem kommen ? sind in der Regel Abfragen.


Dies sollte die richtige Antwort sein, danke für die Inspiration
— Tommy Chong

Hat mir auch sehr geholfen! Es gibt einen Unterschied zwischen Abfrage und Pfad
— Hardy

Was ist dann & gemeint in dieser URL? und in url type = {query} aber in @query ("type") sting responsetype, also wie wird = sign in diese url eingefügt? Ich war verwirrt über dieses Problem
— Adnan Haider

23

Zum Beispiel:

@GET("/user/{username}?type={admin}")

Hier usernameist die pathVariable und typeist die Abfragevariable

@GET("/user/{username}?type={admin}")
void getUserOuth(@Path("username") String username, @Query("type") String type)

@ Paul lass mich es auch ausprobieren. Vielen Dank
— Mwesigye John Bosco

1
Ist es nicht erforderlich sein Typ anstelle von Server - Betreiber als @Query Parameter? Als:void getUserOuth(@Path("username") String username, @Query("type") String type)
— benommen und verwirrt

4

@Query

  • Diese Anmerkung stellt jedes Abfrageschlüsselwertpaar dar, das zusammen mit der Netzwerkanforderung gesendet werden soll

@Path

  • Diese Anmerkung impliziert, dass der übergebene Parameter im Endpunktpfad ausgetauscht wird

3

@ Path Annotation verwenden, um Parameter auf Ihre eigene Weise zu bestellen. Und die Reihenfolge in URL definiert.

@GET("user/{username}/{password}")
Call<List<UserCredentail>> getUserOuth(@Path("username") String username, @Path("password") String password);

@Query Annotation automatische Reihenfolge der Parameter und hinzugefügt mit URL einschließlich "?" Symbol.

   @GET("user")
    Call<List<UserCredentail>> getUserOuth(@Query("username") String username, @Query("password") String password);

2

Die Abfrage wird für URL-Parameter verwendet und mit @Query ("Passwort") sollte die URL wie folgt lauten:

user/john?password=****

Pfad wird verwendet, um in Ihrem Pfad definierte Elemente zu ersetzen, z

user/{username}

1

@Path wird verwendet, wenn Sie eine URL haben, die nach einem Backword-Schrägstrich den dynamischen Wert '/' hat. Beispiel " http://google.com/index.html/userid . In dieser URL ist / userid also dynamisch, um auf diese URL zuzugreifen Anfrage sollte @Get ("index.html / {userid}") sein Calldata (@Path ("userid") int id);

@Query wird verwendet, wenn Sie eine URL mit '?' dynamischer Wert nach einem Fragezeichen. Beispiel " http://google.com/index.html?userid.So in dieser URL? Benutzer-ID ist dynamisch. Um auf diese URL zuzugreifen, sollte Ihre Anfrage @Get (" index.html ") Calldata sein (@Query ("userid") int id);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.