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