java - 使用邮递员上传文件有效,但使用 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
上传路径的文档提到了以下细节:
- 标头内容类型多部分/表单数据
- 只有一个多部分元素
- 元素的 Content-Type 需要是 application/pdf
- 名称必须是“文件”
我想我在我的请求中做了这个列表的每一点 - 那么邮递员请求和我自己的 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();
解决方案
我不得不删除这条线
request.setHeader("Content-type", "multipart/form-data");
让它工作。我真的不知道为什么,所以如果有人可以帮助我解决这个问题并给出一些解释,我会支持它。目前我很高兴,因为它现在有效。
推荐阅读
- node.js - 使用请求验证 node.js 流(管道)中的 HTTP 状态代码
- excel - 有没有办法在电子邮件正文中提取 VBA 中的第一列值?
- python - 无法创建“builtin_function_or_method”实例
- android - Flutter 1.22.5错误无法确定任务':app:compileDebugJavaWithJavac'的依赖关系
- c# - KeyDown 事件不会触发,但与 PreviewMouseLeftButtonDown 事件完全相同的代码将
- python - 在某些值之间替换 df 中的值(将 >1 到 4 替换为 1)
- c++ - 不使用函数打印反向元素
- python - 如何最好地使用邻接表表示来反转 DAG?
- python - Kivy:无法在 kivy 中使用 MD 浮动操作按钮打开相机
- c - 将十进制数组转换为十六进制