发送“?”和RESTEasy的查询字符串中的“=”字符

时间:2016-04-01 04:33:53

标签: rest jax-rs resteasy

我正在使用RESTEasy在我的应用程序中创建REST API:

@GET
@Path("/api")
public Response getData(@QueryParam("from") String from, 
                        @Context HttpServletRequest httpRequest)
                        throws ProtocolException, MalformedURLException, IOException {

    System.out.println("from: " + from);

    ...
}

此代码属于为以下API提供数据:

http://localhost:8080/LynkBeta/f/query?from=search?q=developer

打印时,我只从查询参数中获取以下值:

search?q 

但实际值是:

search?q=developer

查询参数包含等于符号(=)。没有它,它工作正常。我知道我肯定在这里遗漏了一些东西。

如何处理这种价值观?我需要包括什么才能解决这个问题?

我研究了一下,但我的搜索没有直接的答案。

1 个答案:

答案 0 :(得分:3)

简短回答

要将search?q=developer作为查询参数的值发送,此值必须为URL编码。因此,search?q=developer将成为search%3Fq%3Ddeveloper

查询字符串

根据RFC 3986,查询字符串定义如下:

  

3.4. Query

     

查询组件包含非分层数据      路径组件中的数据用于标识a      URI的方案和命名权限范围内的资源      (如果有的话)。查询组件由第一个问题指示      标记(“?”)字符并以数字符号(“#”)字符结束      或者在URI的末尾。 [...]

?(用于启动查询字符串),&(用于分隔查询参数)和=(用于将参数与其值相关联)等字符是reserved

如果您需要发送查询字符串参数的等字符,则需要对其进行URL编码。有关何时需要进行编码的详细信息,请查看2.4 When to Encode or DecodeRFC 3986部分。

网址编码

URL编码也称为百分比enconding:

  

2.1. Percent-Encoding

     

百分比编码机制用于表示a中的数据八位字节      当八位位组的相应字符在...之外时的组件      允许设置或被用作的分隔符或内部分隔符      零件。百分比编码的八位字节被编码为字符      三元组,由百分号“%”后跟两个字符组成      表示该八位字节数值的十六进制数字。对于      例如,“%20”是二进制八位字节的百分比编码      “00100000”(ABNF:%x20),在US-ASCII中对应于空格      角色(SP)。 [...]

许多语言都支持它。以下是Java和JavaScript中的示例:

String param = "search?q=developer";
String url = "http://localhost:8080/LynkBeta/f/query?from=" + 
    URLEncoder.encode(param, "UTF-8");
var param = "search?q=developer";
var url = "http://localhost:8080/LynkBeta/f/query?from=" + 
    encodeURIComponent(param);

使用JAX-RS编码的参数

例如,考虑您要求http://example.com/api/query?biz=search%3Fq%3Ddeveloper

默认情况下,使用@QueryParam注释时,JAX-RS会对查询参数进行URL解码:

@GET
@Path("/foo")
public Response someMethod(@QueryParam("biz") String biz) {
    ...
}

因此,biz参数的值为search?q=developer

如果您需要接收URL编码的参数,请使用@Encoded注释:

@GET
@Path("/foo")
public Response someMethod(@QueryParam("biz") @Encoded String biz) {
    ...
}

现在,biz参数的值为search%3Fq%3Ddeveloper