如何将 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);

    ...
}