Netty:将包含二进制数据的表单字段添加到HTTP POST请求

时间:2015-04-20 20:51:49

标签: java http post bytearray netty

在Netty中有一个HttpPostRequestEncoder类,它有一个addBodyAttribute(String name, String value)方法。我需要使用二进制数据POST一个值,但我找不到一个取byte[] value而不是String value的方法。是否可以通过任何其他手段轻松实现?

2 个答案:

答案 0 :(得分:0)

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

2)使用addBodyHttpData(InterfaceHttpData data)

但问题是,据我所知,RFC不允许" byte"申请/ x-www-form-urlencoded;因此,必须使用默认字符集对值进行编码,这很可能无法生成正确的套装。

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

new HttpPostRequestEncoder(factory, req, true);

它应该有用......

A)所以你可能需要先编码你的"字节"在"文本"方式(作为BASE64编码的7位方式),然后使用默认构造函数addBodyAttribute(String name, String value)创建属性,然后使用BASE64解码器在服务器端解码回二进制值。

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

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

答案 1 :(得分:0)

在深入研究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();