java - HTTP 400 从 Apache HTTP 客户端执行多部分请求时

标签 java tomcat7 cxf apache-httpclient-4.x servlet-3.0

我正在尝试将发送到 Servlet 的请求转发到在 tomcat 7 上运行的 JAX-RS 的 CXF 实现中实现的实际后端。

以下是我的代码,

protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
    HttpPost postRequest = new HttpPost(targetURL);
    if (ServletFileUpload.isMultipartContent(req)) {
        ServletFileUpload servletFileUpload = new ServletFileUpload(new DiskFileItemFactory());
        List<FileItem> fileItemList = servletFileUpload.parseRequest(req);
        MultipartEntityBuilder entityBuilder = MultipartEntityBuilder.create();
        entityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        for (FileItem item: fileItemList) {
            entityBuilder.addPart(item.getFieldName(), new ByteArrayBody(item.get(), ContentType.create(item.getContentType()), item.getName()));
        }
        postRequest.setEntity(entityBuilder.build());
    } else {
        if (StringUtils.isNotEmpty(req.getHeader(HttpHeaders.CONTENT_LENGTH)) || StringUtils.isNotEmpty(req.getHeader(HttpHeaders.TRANSFER_ENCODING))) {
            InputStreamEntity entity = new InputStreamEntity(req.getInputStream(), Long.parseLong(req.getHeader(HttpHeaders.CONTENT_LENGTH)));
            postRequest.setEntity(entity);
        }
    }
    postRequest.setHeader(postRequest.getEntity().getContentType());
    postRequest.setHeader(HttpHeaders.AUTHORIZATION, "ACCESS-TOKEN");
    try (CloseableHttpClient client = HttpClients.createDefault()) {
        HttpResponse response = client.execute(httpRequest);
    }
}

对于非多部分请求,上述代码运行没有问题。但是,每当我尝试多部分请求时,都会收到“HTTP 400 Bad Request”响应。请求也没有传递到实际实现(后端没有错误)

HttpResponseProxy{HTTP/1.1 400 Bad Request [X-Frame-Options: DENY, X-Content-Type-Options: nosniff, X-XSS-Protection: 1; mode=block, Access-Control-Allow-Origin: *, Access-Control-Allow-Methods: GET, POST, DELETE, PUT, Access-Control-Allow-Headers: Content-Type, Date: Fri, 21 Jun 2019 01:27:59 GMT, Content-Length: 0, Connection: close] [Content-Length: 0,Chunked: false]}

我尝试保留传入的内容类型 header 与原始边界,然后后端抛出以下错误。

Caused by: org.apache.cxf.interceptor.Fault: Couldn't find MIME boundary: ----------------------------282428552532940822247758
at org.apache.cxf.interceptor.AttachmentInInterceptor.handleMessage(AttachmentInInterceptor.java:60)
at org.apache.cxf.jaxrs.ext.MessageContextImpl.createAttachments(MessageContextImpl.java:268)
at org.apache.cxf.jaxrs.ext.MessageContextImpl.get(MessageContextImpl.java:77)

知道我在这里做错了什么吗?

最佳答案

postRequest.setHeader(postRequest.getEntity().getContentType());

不要这样做。 HttpClient 根据所包含的 HttpEntity 的属性自动为请求消息正文生成 Content-Type header 。

关于java - HTTP 400 从 Apache HTTP 客户端执行多部分请求时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56679029/

相关文章:

java - org.apache.cxf.jaxrs.client.WebClient 中的 RecieveTimeout 和 SynchronousTimeout 有什么区别?

java - 在 JAX-RS 资源中组合 @Context 和 @RolesAllowed?

java - 创建数百万个小型临时对象的最佳实践

java - Android - 找不到 NullPointerException 的原因

java - 任何以注释方式在没有Spring的情况下读取属性文件的API

java - Tomcat7卡塔琳娜错误

java - 未捕获的异常处理程序 - UiAutomator

java - Tomcat 内存消耗

java - ServletRequest.getRequestDispatcher() 对于不存在的文件/资源

java - C# WCF AddressHeader 的 Java Apache CXF 等效项是什么?