Netty:向HTTPPOST请求添加带有二进制数据的表单字段



在Netty中有一个HttpPostRequestEncoder类,它具有addBodyAttribute(String name, String value)方法。我需要用二进制数据POST一个值,但我找不到使用byte[] value而不是String value的方法。通过其他方式是否容易实现?

经过对Netty来源的深入研究,我发现有点像一个解决方案:

byte[] buf = new byte[200];
...
DefaultFullHttpRequest req = new DefaultFullHttpRequest(httpVersion, HttpMethod.POST, uri);
DefaultHttpDataFactory factory = new DefaultHttpDataFactory();
HttpPostRequestEncoder enc = new HttpPostRequestEncoder(factory, req, false, CharsetUtil.UTF_8, HttpPostRequestEncoder.EncoderMode.RFC1738);
Attribute attr = factory.createAttribute(req, "someBinaryVar");
attr.setContent(io.netty.buffer.Unpooled.wrappedBuffer(buf));
enc.addBodyHttpData(attr);
...
enc.finalizeRequest();

如果在标准POST(application/x-www-form-urlencoded)中,可以尝试使用以下(假定错误)组合:1) 创建他/她自己的data = InterfaceHttpData(例如基于MemoryAttribute),并用从给定字节[](setContent())构建的ChannelBuffer/ByteBuffer(根据Netty版本)填充

2) 使用addBodyHttpData(InterfaceHttpData data)

但问题是,据我所知,RFC不允许应用程序/x-www-form-urlencoded使用"字节";因此,必须使用默认字符集对值进行编码,这可能不会产生正确的answear。

编辑:为了利用这一点,可以相应地创建编码器以使用multipart:

new HttpPostRequestEncoder(factory, req, true);

它应该起作用。。。

A) 因此,您可能必须首先以"文本"方式(7位方式作为BASE64编码)对"字节"进行编码,然后使用默认构造函数addBodyAttribute(String name, String value)创建属性,然后在服务器端使用BASE64解码器将值解码回二进制。

=>但这需要服务器执行特殊解码操作(BASE64)

B) 另一种选择是创建一个多部分POST请求,然后创建一个"虚拟"文件上传,例如使用MemoryFileUpload,使用来自您自己的ChannelBuffer/ByteBuffer(根据Netty版本)的setContent()从给定字节[]构建;因此,服务器端将不得不像往常一样处理二进制内容(不需要解码)。

最新更新