2010-01-07 57 views
2

二进制HTTP之后的参数我有一个二进制值是URL编码,然后发布到一个HttpServlet的。以下代码显示了我第一次尝试提取这些数据的方式。非常简单,除了结果是一个字符串,而不是字节。获取在的Java/Tomcat的/ HttpServlet的

这似乎在第一工作,只是一个额外的字节出现了3个字节结束。我最终发现的是,我的数据被视为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

你可以显示你有什么话发布了一些例子,你得到了什么? – axtavt 2010-01-07 00:32:28

+0

正如其名称所暗示的那样,URL编码是针对URL的。二进制数据应该用例如Base64编码。 – 2010-01-07 00:42:09

回答

2

我认为这应该工作(它对待请求作为单字节编码,所以转化为String是完全可逆的):

String someSingleByteEncoding = "ISO-8859-1"; 
request.setCharacterEncoding(someSingleByteEncoding); 
String requestStr = request.getParameter("request"); 
byte[] rawRequestMsg = requestStr.getBytes(someSingleByteEncoding); 
+0

这是行得通的,但我不确定我是否应该考虑它是否正确。这是为了将Web API暴露在公司内部以各种语言向各种人员展示。 – DonGar 2010-01-07 01:13:35

+0

我回到这个'正确'的答案。很大一部分原因是它也允许通过GET和POST完成调用。所讨论的二进制斑点很小(协议缓冲区结构),并且对服务器调用的灵活性非常重要。 – DonGar 2010-01-07 02:11:03

+1

你真的需要记录在发送之前字符串必须用相同的字符集进行编码。为了准备支配世界,我建议在双方都使用UTF-8。 – BalusC 2010-01-07 02:49:58

0

你可以做这servlet wrapper(了HttpServletRequestWrapper)...赶上请求,并抢夺请求主体之前的解码

但最好的方法可能是将数据发送的文件上传(的multipart/form-data的内容类型)

3

有两种可能的解决方案:张贴之前

  • ASCII编码您的数据。 Base64将是一个明智的选择。在你的servlet中对它进行解码,然后再次获得你的原始二进制文件。

  • 使用表单内容类型multipart/form-datahttp://www.w3.org/TR/html401/interact/forms.html#h-17.13.4)将您的二进制数据编码为字节流;那么你的servlet可以做servletRequest.getReader()来读取数据,再次作为二进制流。

+0

我认为你是对的,并且使用multipart/form-data是正确的答案。 – DonGar 2010-01-07 01:16:24