【问题标题】:How to use the query parameters in Java Jersey Application?如何在 Java Jersey Application 中使用查询参数?
【发布时间】:2017-01-04 02:57:08
【问题描述】:

我正在关注一个教程,并且还使用了 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

我尝试过传递字符串、整数等,但没有任何效果。 uri Info 打印正确,响应也很好。问题是我没有得到要在 Java 代码中读取的参数。一旦我能够做到这一点,我将需要传递许多其他参数。请建议。谢谢!!

【问题讨论】:

  • 我希望它会在服务器控制台中打印以下内容:Data Received: ?user=123 | 123 同样,稍后我想传递字符串和(如果可能,可能是 JSON)。

标签: java jersey jax-rs


【解决方案1】:

我觉得你太努力了。据我所知,如果您调用 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;
    }
}

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

【讨论】:

    【解决方案2】:

    @QueryParam("user") int 用户

    该用户 int 的值应该是 123

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

    【讨论】:

    • 是的。我希望以下行显示 123 而不是 null:String nameParam = queryParams.getFirst("user"); System.out.println("Data Received: " + uriInfo.getRequestUri().getQuery() + " | " + nameParam); 我什至尝试将 int 更改为 String 和 Integer。没有任何效果!
    • 试试 System.out.println(user);
    • 我试过了,它打印 111 而不是 null 即默认值。 String nameParam = queryParams.getFirst("user"); System.out.println("Data Received: " + uriInfo.getRequestUri().getQuery() + " | " + nameParam); System.out.println(user); 结果:Data Received: ?user=aaaaa | null 111 --> 应该是 123
    • 不确定问题是不是混合了两个范式,要么使用 QueryParam 或 UriInfo,清理你的代码,如果需要,创建两个测试方法见mkyong.com/webservices/jax-rs/jax-rs-queryparam-example
    【解决方案3】:

    嗯,我认为您在使用 Java 类型时遇到了问题。

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

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

    【讨论】:

      【解决方案4】:

      查询参数主要用于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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 2014-09-06
        • 1970-01-01
        • 2016-01-23
        • 1970-01-01
        • 2016-04-08
        相关资源
        最近更新 更多