改造2 @path Vs @query

时间:2016-06-08 09:27:55

标签: java android rest retrofit2

我是改造2库的新手。我读了几篇文章作为初学者入门,我设法从我的RESTful API中获取XML数据而不指定参数。在我的方法中生成XML资源如下。

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

现在我试图在界面中传递参数

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

无法运行,客户端未收到任何数据。我花了一个星期试图通过使用非参数调用获取资源来修复它; 所以试着把它改成:

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

它工作正常。所以我的问题是:我何时需要在改造2中使用@Query@Path注释?

7 个答案:

答案 0 :(得分:94)

考虑这是网址:

@routes.Application.hello("test")

现在这是电话:

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

所以我们有:

www.app.net/api/searchtypes/的 {路径} /过滤器类型= <强> {查询} &安培; SEARCHTEXT = <强> {查询}

之后的事情通常是查询。​​

答案 1 :(得分:17)

例如:

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

此处usernamepath变量,type是查询变量

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

答案 2 :(得分:2)

查询用于URL参数,使用@Query(“password”),URL应为:

user/john?password=****

路径用于替换路径中定义的项目,例如

user/{username}

答案 3 :(得分:1)

当你的url在后缀斜杠后面有'/'动态值时会使用@Path。例如“http://google.com/index.html/userid。所以在这个url / userid是动态的,所以要访问这个url你的请求应该是 @Get( “index.html的/ {用户id}”) Calldata(@Path(“userid”)int id);

当你有一个有'?'的网址时会使用@Query问号后的动态值。例如此网址中的“http://google.com/index.html?userid.So?userid是动态的,因此要访问此网址,您的请求应为 @Get( “index.html的”) Calldata(@Query(“userid”)int id);

答案 4 :(得分:0)

@Path注释用于按您自己的方式对参数进行排序。并在url中定义顺序。

iex(4)> EdtrApi.all             
[debug] QUERY OK source="edtrs" db=2.8ms queue=2.0ms
SELECT e0."id", e0."dtr_date", e0."user_id", e0."inserted_at", e0."updated_at" FROM "edtrs" AS e0 []
[
  %Myapp.EdtrApi.Edtr{
    __meta__: #Ecto.Schema.Metadata<:loaded, "edtrs">,
    dtr_date: #DateTime<2018-12-29 16:00:00Z>,
    id: 1,
    inserted_at: ~N[2018-12-11 09:11:18],
    updated_at: ~N[2018-12-11 09:11:18],
    user_id: "8189f04b-e3d7-4d17-8df2-fedbeb0399b1"
  },
  %Myapp.EdtrApi.Edtr{
    __meta__: #Ecto.Schema.Metadata<:loaded, "edtrs">,
    dtr_date: #DateTime<2018-12-30 16:00:00Z>,
    id: 2,
    inserted_at: ~N[2018-12-11 09:11:18],
    updated_at: ~N[2018-12-11 09:11:18],
    user_id: "8189f04b-e3d7-4d17-8df2-fedbeb0399b1"
  },
  %Myapp.EdtrApi.Edtr{
    __meta__: #Ecto.Schema.Metadata<:loaded, "edtrs">,
    dtr_date: #DateTime<2018-12-29 16:00:00Z>,
    id: 3,
    inserted_at: ~N[2018-12-11 09:12:17],
    updated_at: ~N[2018-12-11 09:12:17],
    user_id: "8189f04b-e3d7-4d17-8df2-fedbeb0399b1"
  }
]

iex(5)>

@Query注释参数的自动顺序,并添加包含“?”的网址符号。

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

答案 5 :(得分:0)

@Query

  • 此注释表示将与网络请求一起发送的所有查询键值对

@Path

  • 此注释表示所传递的参数将在端点路径中交换

答案 6 :(得分:0)

Kotlin 答案

例如 从带有帖子ID的列表中获取特定帖子:

@GET("Posts/{post_id}")
suspend fun getPost(@Path("post_id") postId: String): Response<Post>