我正在尝试找到解决我正在帮助支持的网络应用程序中设计缺陷的最佳方法。服务的一部分将参数(“myparam”)传递给 .jsp 页面,该页面又调用 REST 服务,包括我们的 myparam 作为路径参数。设计缺陷在于 myparam 应该作为表单参数传递,因为它可以是自由文本。但是,我们无法更改实现,因为 .jsp 最终涉及到其他方。
我的解决方案是使用十六进制编码对 myparam 进行编码(单独的 url 编码不起作用,因为你最终会得到“%”等,REST 的 org.restlet 实现不喜欢在路径参数中看到)。使用 Apache 编解码器库,我有这样的东西:
选项 1(仅十六进制):
String decodedParam = new String(Hex.decodeHex(myparam.toCharArray()));
这符合我们的目的。我真正想做的是结合 URL 和 Hex 编码,这样我就可以真正涵盖所有可能性:
选项 2(十六进制 + url 解码):
参数准备:
String workText = URLEncoder.encode(inText, encoding); // a
char[] encodedBytes = Hex.encodeHex(workText.getBytes()); // b
String myparam = new String(encodedBytes);
解码(REST):
String decodedParam = new String(Hex.decodeHex(myparam.toCharArray())); // c
String doubleDecodedParam = URLDecoder.decode(decodedParam, "UTF-8"); // d
我有两个问题:
为什么第二个选项不起作用?(每当我尝试在 d 处对我的字符串进行 URL 解码时)我得到一个 java.lang.IllegalArgumentException)。我已经在http://ostermiller.org/calc/encode.html测试了我的参数值的双重编码和解码,没有问题。
有没有更好的方法用 REST 对路径参数进行编码?