我正在使用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
查询参数包含等于符号(=
)。没有它,它工作正常。我知道我肯定在这里遗漏了一些东西。
如何处理这种价值观?我需要包括什么才能解决这个问题?
我研究了一下,但我的搜索没有直接的答案。
答案 0 :(得分:3)
要将search?q=developer
作为查询参数的值发送,此值必须为URL编码。因此,search?q=developer
将成为search%3Fq%3Ddeveloper
。
根据RFC 3986,查询字符串定义如下:
查询组件包含非分层数据 路径组件中的数据用于标识a URI的方案和命名权限范围内的资源 (如果有的话)。查询组件由第一个问题指示 标记(“?”)字符并以数字符号(“#”)字符结束 或者在URI的末尾。 [...]
?
(用于启动查询字符串),&
(用于分隔查询参数)和=
(用于将参数与其值相关联)等字符是reserved
如果您需要发送查询字符串参数的值等字符,则需要对其进行URL编码。有关何时需要进行编码的详细信息,请查看2.4 When to Encode or Decode的RFC 3986部分。
URL编码也称为百分比enconding:
百分比编码机制用于表示a中的数据八位字节 当八位位组的相应字符在...之外时的组件 允许设置或被用作的分隔符或内部分隔符 零件。百分比编码的八位字节被编码为字符 三元组,由百分号“%”后跟两个字符组成 表示该八位字节数值的十六进制数字。对于 例如,“%20”是二进制八位字节的百分比编码 “00100000”(ABNF:%x20),在US-ASCII中对应于空格 角色(SP)。 [...]
许多语言都支持它。以下是Java和JavaScript中的示例:
URLEncoder
类:String param = "search?q=developer";
String url = "http://localhost:8080/LynkBeta/f/query?from=" +
URLEncoder.encode(param, "UTF-8");
encodeURIComponent()
功能:var param = "search?q=developer";
var url = "http://localhost:8080/LynkBeta/f/query?from=" +
encodeURIComponent(param);
例如,考虑您要求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
。