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?

Mwesigye John Bosco
quelle

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.

Nongthonbam Tonthoi
quelle
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)
Nikson Kanti Paul
quelle
@ 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
Mina
quelle
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);
Majedur Rahaman
quelle
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}
Johann67
quelle
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);

Malti Devnani
quelle