如何查看多部分表单请求的内容?

我正在使用Apache HTTPClient 4。我正在做非常普通的多部分工作,如下所示:

val entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
entity.addPart("filename", new FileBody(new File(fileName), "application/zip").asInstanceOf[ContentBody])
entity.addPart("shared", new StringBody(sharedValue, "text/plain", Charset.forName("UTF-8")));

val post = new HttpPost(uploadUrl);
post.setEntity(entity);

我想在发送实体(或帖子等)之前查看其内容。但是,该特定方法未实现:

entity.getContent() // not defined for MultipartEntity

如何查看我发布的内容?


答案 1

使用 writeTo(java.io.OutputStream) 方法将内容写入 ,然后将该流转换为 or :org.apache.http.entity.mime.MultipartEntityjava.io.OutputStreamStringbyte[]

// import java.io.ByteArrayOutputStream;
// import org.apache.http.entity.mime.MultipartEntity;
// ...
// MultipartEntity entity = ...;
// ...

ByteArrayOutputStream out = new ByteArrayOutputStream(entity.getContentLength());

// write content to stream
entity.writeTo(out);

// either convert stream to string
String string = out.toString();

// or convert stream to bytes
byte[] bytes = out.toByteArray();

注意:这仅适用于小到足以读入内存的多部分实体,并且小于2Gb,这是Java中字节数组的最大大小。


答案 2

以下肯定会有所帮助:

ByteArrayOutputStream content = new ByteArrayOutputStream();
httpEntity.writeTo(content);
logger.info("Calling "+url+" with data: "+content.toString());

与第一个答案相比,上面的修复程序,无需将任何参数传递给ByteArrayOutputStream构造函数。