我遇到的问题是,某些与我的API集成的客户端不符合标准(当然:))。
因此,一些客户端而不是添加文件附件是在请求正文中发送文件的内容(具有错误的标头)。这会导致CXF异常(无法找到边界)。
我已经实现了一个InInterceptor来检查内容。首先我已经更改了内容类型,否则CXF会返回415错误。
我现在如何将纯文本输入请求正文转换为附件?
@Override
public void handleMessage(Message message) throws Fault {
Map<String,List> map = (Map<String, List>)message.get(Message.PROTOCOL_HEADERS);
if(url != null && url.indexOf("uploadFile") > 0) { //TODO && !Content-type = multipart/form-data
message.remove(Message.CONTENT_TYPE);
message.put(Message.CONTENT_TYPE, "multipart/form-data");
map.put("content-type", Collections.singletonList("multipart/form-data"));
message.put(Message.PROTOCOL_HEADERS, map);
}
InputStream is = message.getContent(InputStream.class);
StringWriter writer = new StringWriter();
try {
IOUtils.copy(is, writer, "UTF-8");
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String requestBody = writer.toString();
System.out.println(requestBody);
}
我注意到,如果请求是正确的(文件附加),输入请求看起来像这样(注意边界字符串):
--g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq
Content-Disposition: form-data; name="upload__31e8f749_142e740a2c1__7fff_00000040.tmp"; filename="upload__31e8f749_142e740a2c1__7fff_00000040.tmp"
Content-Type: application/octet-stream; charset=ISO-8859-1
Content-Transfer-Encoding: binary
FILE CONTENT
--g-fcgqFfRThi-YWVLasSjj8mvL2PJecFQq--
如果它不正确(请求正文中的纯文本),输入流就是这样:
FILE CONTENT
然后这会导致“未找到边界异常”。当然,我现在在这段代码中得到“Stream closed”异常,但这只是因为我处于寻找解决方案的模式。