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

Netty: adding a form field with binary data to a HTTP POST request

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

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

2) 使用addBodyHttpData(InterfaceHttpData data)

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

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

new HttpPostRequestEncoder(factory, req, true);

它应该工作...

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

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

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

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