0

我有一個Web服務,它接收一個帶有以十六進制值編碼的特殊字符的參數。如何將URL參數傳遞給運動服web服務,如...?lib = T%E2che%20Yves

@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編碼參數已經被Jersey機制以一種錯誤的方式進行了引導,我似乎無法控制它?

謝謝你的幫助。

回答

1

當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) { 
    ... 
} 
+0

謝謝卡西奧Mazzochi莫林! – Glassfrog

0

這就是我將要使用的最終代碼:

@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); 

    ... 
}