简体   繁体   中英

File upload with postman works but fails with Apache HttpClient

Problem

I'm working with an external REST API on a test system. There is an upload path I'm trying to implement and I am using the Apache HTTPClient. I tried it with the following postman configuration and it works perfectly:

邮递员请求

The upload works fine like that.

Implementation in 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);

Error

I always get a specific error from the rest api:

File could not have been parsed

The documentation of the upload path mentions the following details:

  • Header Content-Type multipart/form-data
  • Only one multipart element
  • Content-Type of the element needs to be application/pdf
  • Name needs to be "file"

I think I do every point of this list in my request - so what is the difference between the postman request and my own java http request?

What do I miss?

EDIT:

The same code with OkHTTP works. Still don't know why it does not work with 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();

I had to remove this line

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

to make it work. I dont really know why so if someone can help me out with this and give some explanation I'm up for it. For the moment I'm happy because it works now.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM