如何在Java Jersey应用程序中使用查询参数?

时间:2017-01-04 02:57:08

标签: java jersey jax-rs

我正在学习教程并使用Stackoverflow问题here。 这是我的Java类:

package com.crunchify.tutorial;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import org.json.simple.JSONObject;

@Path("api")
public class CrunchifyAPI {

    @SuppressWarnings("unchecked")
    @GET
    @Path("/get")
    @Consumes(MediaType.TEXT_PLAIN)
    public String get(
            @DefaultValue("111") @QueryParam("user") int user,
            @Context UriInfo uriInfo
            ) {
        MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
        String nameParam = queryParams.getFirst("user");
        System.out.println("Data Received: " + uriInfo.getRequestUri().getQuery()
                + " | " + nameParam);
        JSONObject obj = new JSONObject();
        obj.put("auth", true);
        String ret = JSONObject.toJSONString(obj);
        return ret;
    }
}

以下是我从邮递员那里得到的信息:

GET>> localhost/api/get?user=123

回复是:

{"auth":true}

服务器控制台:

Starting Crunchify's Embedded Jersey HTTPServer...

Started Crunchify's Embedded Jersey HTTPServer Successfully !!!
Data Received: ?user=123 | null
User Authenticated: true

我尝试过传递String,Integer等但没有任何作用。 uri Info正确打印,回复也很好。问题是我没有在Java代码中读取参数。一旦我能够实现这一目标,我将需要传递许多其他参数。请建议。谢谢!

4 个答案:

答案 0 :(得分:3)

我觉得你太努力了。据我所知,如果你调用localhost / api / get?user = 123:

,那么你应该得到你想要的东西。
package com.crunchify.tutorial;

import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Consumes;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriInfo;
import org.json.simple.JSONObject;

@Path("api")
public class CrunchifyAPI {

    @SuppressWarnings("unchecked")
    @GET
    @Path("/get")
    @Consumes(MediaType.TEXT_PLAIN)
    public String get(
            @DefaultValue("111") @QueryParam("user") Integer user,
            @Context UriInfo uriInfo
            ) {
        System.out.println("Data Received: " + uriInfo.getRequestUri().getQuery()
                + " | " + name);
        JSONObject obj = new JSONObject();
        obj.put("auth", true);
        String ret = JSONObject.toJSONString(obj);
        return ret;
    }
}

如果您需要的只是用户参数中传递的信息,那么查询字符串的所有额外内容都不是必需的。

答案 1 :(得分:1)

@QueryParam(“user”)int user

该用户int的值应为123

请参阅https://www.mkyong.com/webservices/jax-rs/jax-rs-queryparam-example/

答案 2 :(得分:0)

好吧,我认为您遇到了Java类型的问题。

如果您的用户是Integer,如果您想使用StringStringInteger.toString()),则应首先将其传递给String.valueof()

但是你传递参数的方式让我烦恼,我不确定你是否可以通过纯文本类型传递整数。

答案 3 :(得分:0)

查询参数主要用于 get rest api 以将数据客户端发送到服务器。它可以是可选的。如果它是可选的,那么您可以在没有查询参数的情况下调用 api(路径参数是必需的)。我们可以在 url 中发送查询参数为

http://localhost:8080/JerseyDemo/rest/user/12?p=10

并且您可以在服务器端检索此查询参数值

 @GET
    @Path("/{id}")
    public Response addUser(@PathParam("id") int id,@QueryParam("p") int page) {
        System.out.println("id=" + id+"page="+page);
        String str = "id is=" + id+"page="+page;
        return Response.status(Status.OK).entity(str).build();
   }

有关查询参数的更多详细信息访问:Query Parameter Example In Jersey