首页 > 解决方案 > 使用邮递员上传文件有效,但使用 Apache HttpClient 失败

问题描述

问题

我正在测试系统上使用外部 REST API。我正在尝试实现一个上传路径,并且我正在使用 Apache HTTPClient。我使用以下邮递员配置进行了尝试,并且效果很好:

邮递员请求

上传工作正常。

用Java实现

CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPut request = new HttpPut("../upload") // placeholder url, not the real one
    
request.setHeader("Content-type", "multipart/form-data");   
request.setHeader(HttpHeaders.AUTHORIZATION, "HEY I AM A TOKEN");       
    
FileBody fileBody = new FileBody(new File("dummy.pdf"), ContentType.create("application/pdf"));
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addPart("file", fileBody);
request.setEntity(builder.build());
    
CloseableHttpResponse response = httpClient.execute(request);

错误

我总是从其余的 api 中得到一个特定的错误:

File could not have been parsed

上传路径的文档提到了以下细节:

我想我在我的请求中做了这个列表的每一点 - 那么邮递员请求和我自己的 java http 请求有什么区别?

我想念什么?

编辑:

与 OkHTTP 相同的代码可以工作。仍然不知道为什么它不适用于 Apache HttpClient。

OkHttpClient testClient = new OkHttpClient();
File testfile = new File("dummy.pdf");

RequestBody body = new MultipartBuilder().type(MultipartBuilder.FORM).addFormDataPart("file","dummy.pdf",
RequestBody.create(MediaType.parse("application/pdf"),testfile)).build();

Request testreq = new Request.Builder()
.url("../upload")
.header("Authorization", "HI I AM A TOKEN")
.put(body)
.build();
Response testres = testClient.newCall(testreq).execute();

标签: javaapache-httpclient-4.x

解决方案


我不得不删除这条线

request.setHeader("Content-type", "multipart/form-data");   

让它工作。我真的不知道为什么,所以如果有人可以帮助我解决这个问题并给出一些解释,我会支持它。目前我很高兴,因为它现在有效。


推荐阅读