我有一个二进制值是URL编码,然后POST到一个HttpServlet。以下代码显示了我首次尝试提取此数据的方式。非常简单,除了结果是字符串,而不是字节。
这似乎首先起作用,除了从末尾出现三个字节的额外字节。我最终想到的是我的数据被视为Unicode并从一个Unicode编码转换为UTF-8。
那么,除了获取整个帖子体并自己解析之外,如何解码url编码后如何在不将其作为字符串处理的情况下提取数据?我是否误解了一般发布数据的规范,还是特定于Java / Tomcat的问题?
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Receive/Parse the request
String requestStr = request.getParameter("request");
byte[] rawRequestMsg = requestStr.getBytes();
以下是我用于请求的Python测试脚本的片段:
urlRequest = urllib.urlencode( {'request': rawRequest} )
connection = urllib.urlopen(self.url, data = urlRequest)
result = connection.readlines()
connection.close()
答案 0 :(得分:3)
有两种可能的解决方案:
在发布数据之前对数据进行ASCII编码。 Base64将是一个明智的选择。在您的servlet中对其进行解码,然后再次使用原始二进制文件。
使用表单内容类型multipart/form-data
(http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4)将二进制数据编码为字节流;那么你的servlet可以servletRequest.getReader()
来读取数据,再次作为二进制流。
答案 1 :(得分:2)
我认为这应该有用(它将请求视为单字节编码,因此转换为String
是完全可逆的):
String someSingleByteEncoding = "ISO-8859-1";
request.setCharacterEncoding(someSingleByteEncoding);
String requestStr = request.getParameter("request");
byte[] rawRequestMsg = requestStr.getBytes(someSingleByteEncoding);
答案 2 :(得分:0)
您可以使用servlet wrapper(HttpServletRequestWrapper)执行此操作...捕获请求并在解码之前抢夺请求正文
但最好的方法可能是将数据作为文件上传(multipart / form-data content type)发送