Многостраничный почтовый запрос в Apache Httpclient 4.5.6 не работает

Я пытаюсь загрузить файл на сервер. Запрос работает нормально при использовании инструмента Postman.

В Почтальоне у меня есть:

POST :https://transport-stg.transperfect.com/api/files/upload?filename=test.png&targetFolderId=2ff5ea6a-8187-4622-ab58-c7511c445ae7

В заголовке у меня есть:

Content-Type = multipart/form-data
Authorixation = Bearer access_code

В теле у меня есть:

  file = test.txt (this is file to be uploaded,able to select file location in Postman)

Это выше работает, как и ожидалось, в инструменте почтальона.

Теперь я написал код ниже на Java, используя HttpClient 4.5.6 как

try {
 CloseableHttpClient httpClient = HttpClients.createDefault();
File file = new File("C:\\Users\\lKadariya\\Desktop\\test.txt");
  String authorizationValue = "Bearer "+accessToken;
HttpEntity data = MultipartEntityBuilder.create()
        .setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
        .addBinaryBody("srcUploader",file,ContentType.DEFAULT_BINARY,file.getName())
        .build();
  HttpUriRequest request = RequestBuilder.post("https://transport-stg.transperfect.com/api/files/upload")
          .addHeader("Content-Type","multipart/form-data")
          .addHeader("Authorization",authorizationValue)
          .addHeader("Accept","application/json")
          .addParameter("filename","test.txt")
          .addParameter("targetFolderId","2ff5ea6a-8187-4622-ab58-c7511c445ae7")
          .setEntity(data)
          .build();
   ResponseHandler<String> responseHandler = response -> {
    int status = response.getStatusLine().getStatusCode();
    if (status >= 200 && status < 300) {
      HttpEntity entity = response.getEntity();
      return entity != null ? EntityUtils.toString(entity) : null;
    } else {
      throw new ClientProtocolException("Unexpected response status: " + status);
    }
  };
  String responseBody = httpClient.execute(request, responseHandler);

И я не могу загрузить файл. ОШИБКА: Невозможно загрузить файл с сервера. почтальон дает ожидаемый ответ.

Что может пойти не так с приведенным выше кодом Httpclient?

Библиотека OKhttp также работает нормально, т.к.

OkHttpClient client = new OkHttpClient();
    RequestBody requestBody = new MultipartBody.Builder()
            .setType(MultipartBody.FORM)
//            .addPart(
//                    Headers.of("Content-Disposition", "form-data; name=\"title\""),
//                    RequestBody.create(null, "test"))
            .addPart(
                    Headers.of("Content-Disposition", "form-data; name=\"test\""),
                    RequestBody.create(MEDIA_TYPE_TXT, new File("test.txt")))
//            .addFormDataPart("file","file.txt",
//                    RequestBody.create(MediaType.parse("application/octet-stream"),new File("test.txt"))
//                    )
            .build();

    Request request = new Request.Builder()
            .header("Authorization", "Bearer " + accessToken)
            .url("https://transport-stg.transperfect.com/api/files/upload?filename=basic.txt&targetFolderId=2ff5ea6a-8187-4622-ab58-c7511c445ae7")
            .post(requestBody)
            .header("Content-Type","multipart/form-data")
            .build();
try {
  Response response = client.newCall(request).execute();

Что может пойти не так в коде HttpClient?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
1 124
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
HttpUriRequest request = RequestBuilder.post("https://transport-stg.transperfect.com/api/files/upload")
      .addHeader("Content-Type","multipart/form-data")

Значение Content-Type в вашем коде недопустимо, так как оно не включает параметр boundary.

Вы не должны вмешиваться в заголовок Content-Type на уровне запроса и позволять HttpClient генерировать его автоматически на основе свойств вложенного объекта запроса.

Другие вопросы по теме