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();
在 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();