如何将 URL 参数传递给球衣 Web 服务,例如 ...?lib=T%E2che%20Yves
How to pass a URL parameter to jersey web service like ...?lib=T%E2che%20Yves
我有一个 Web 服务接收一个参数,该参数包含以十六进制值编码的特殊字符。
@PUT
@Path("/tasks")
@Produces("application/xml; charset=UTF-8")
public Response createTask( @QueryParam("lib")
String pLibelle) {
logger.debug(" -> lib =" + pLibelle);
...
使用以下 lib 参数:
http://webservice.com/tasks?lib=T%E2che%20Yves
调试器显示:
-> lib =T?che Yves
但我很期待
-> lib =T%E2che%20Yves
或者如果我的梦想成真,我可以:
-> lib =Tâche Yves
(即URL编码前的原始字符串)
所以我的问题是:
我怎样才能得到我的原始字符串?看来 URL-encoded 参数已经被 Jersey 机制以错误的方式翻译了,我似乎无法控制它?
感谢您的帮助。
当 URL 编码时,Tâche Yves
应该是 T%C3%A2che%20Yves
而不是 T%E2che%20Yves
。
注意以下几点:
- 使用 UTF-8 时,
â
被编码为 %C3%A2
。
- 使用CP-1252时,
â
编码为%E2
。
您可以使用 @Encoded
注释来获取 URL 编码的值:
@PUT
@Path("/foo")
@Produces("application/xml; charset=UTF-8")
public Response method(@Encoded @QueryParam("bar") String bar) {
...
}
这是我要使用的最终代码:
@PUT
@Path("/tasks")
@Produces("application/xml; charset=UTF-8")
public Response createTask(@Encoded @QueryParam("lib") String pLibelleUrlIso8859_1) {
String lLibelleIso8859_1 = "";
String lLibelleUtf8 = "";
try {
// Conversion 1 : (ISO-8859-1 + URLEncoded) -> ISO-8859-1
lLibelleIso8859_1 = java.net.URLDecoder.decode(pLibelleUrlIso8859_1, "ISO-8859-1");
// Conversion 2 : ISO-8859-1 -> UTF-8
lLibelleUtf8 = javax.mail.internet.MimeUtility.decodeText(lLibelleIso8859_1);
} catch (UnsupportedEncodingException e1) {
logger.error("[createTask] " + e1.getMessage());
// ERROR 500 - A038
lOutput = erreurXml("A038",
"Unsupported encoding. ISO-8859-1 + URL Encoding expected.",
e1);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(lOutput).build();
}
logger.debug(" -> lib =" + pLibelleUtf8);
...
}
我有一个 Web 服务接收一个参数,该参数包含以十六进制值编码的特殊字符。
@PUT
@Path("/tasks")
@Produces("application/xml; charset=UTF-8")
public Response createTask( @QueryParam("lib")
String pLibelle) {
logger.debug(" -> lib =" + pLibelle);
...
使用以下 lib 参数:
http://webservice.com/tasks?lib=T%E2che%20Yves
调试器显示:
-> lib =T?che Yves
但我很期待
-> lib =T%E2che%20Yves
或者如果我的梦想成真,我可以:
-> lib =Tâche Yves
(即URL编码前的原始字符串)
所以我的问题是: 我怎样才能得到我的原始字符串?看来 URL-encoded 参数已经被 Jersey 机制以错误的方式翻译了,我似乎无法控制它?
感谢您的帮助。
当 URL 编码时,Tâche Yves
应该是 T%C3%A2che%20Yves
而不是 T%E2che%20Yves
。
注意以下几点:
- 使用 UTF-8 时,
â
被编码为%C3%A2
。 - 使用CP-1252时,
â
编码为%E2
。
您可以使用 @Encoded
注释来获取 URL 编码的值:
@PUT
@Path("/foo")
@Produces("application/xml; charset=UTF-8")
public Response method(@Encoded @QueryParam("bar") String bar) {
...
}
这是我要使用的最终代码:
@PUT
@Path("/tasks")
@Produces("application/xml; charset=UTF-8")
public Response createTask(@Encoded @QueryParam("lib") String pLibelleUrlIso8859_1) {
String lLibelleIso8859_1 = "";
String lLibelleUtf8 = "";
try {
// Conversion 1 : (ISO-8859-1 + URLEncoded) -> ISO-8859-1
lLibelleIso8859_1 = java.net.URLDecoder.decode(pLibelleUrlIso8859_1, "ISO-8859-1");
// Conversion 2 : ISO-8859-1 -> UTF-8
lLibelleUtf8 = javax.mail.internet.MimeUtility.decodeText(lLibelleIso8859_1);
} catch (UnsupportedEncodingException e1) {
logger.error("[createTask] " + e1.getMessage());
// ERROR 500 - A038
lOutput = erreurXml("A038",
"Unsupported encoding. ISO-8859-1 + URL Encoding expected.",
e1);
return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
.entity(lOutput).build();
}
logger.debug(" -> lib =" + pLibelleUtf8);
...
}