powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
10 сообщений из 10, страница 1 из 1
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583767
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В постмане такой запрос проходит нормально:



пытаюсь через спринг темплейт:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
LinkedMultiValueMap<String, Object> map = new LinkedMultiValueMap<>();
exchange.getIn().getHeader(Exchange.FILE_NAME_ONLY, String.class);
map.add("file", new File("filePath");
int lastIndexOfDot = fileName.lastIndexOf(".");
map.add("type", fileName.substring(lastIndexOfDot + 1));
map.add("org_id", systemSettingsService.getSystemSettings().getOrganizationId());
map.add("stone_id", fileName.substring(0, lastIndexOfDot));

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
HttpEntity<LinkedMultiValueMap<String, Object>> requestEntity = new HttpEntity<>( map, headers);

restTemplate = new RestTemplate();                     
try {
    ResponseEntity<String> result = restTemplate.exchange(buildUrl(), HttpMethod.POST, requestEntity, String.class);
    logger.info("result {}", result);
 } catch (Exception e) {
     logger.error("Error", e);
 }



Получаю 400 Bad request

Что я делаю не так?

я пытался снифферить в Фидлере, но почему то снифферится только постман несмотря на то, что я выставлял систем сеттинги
Код: java
1.
2.
3.
4.
	System.setProperty("http.proxyHost", "127.0.0.1");
	System.setProperty("https.proxyHost", "127.0.0.1");
	System.setProperty("http.proxyPort", "8888");
	System.setProperty("https.proxyPort", "8888");



В постмане снифферится:
запрос


ответ



Что ещё можно попробовать?
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583773
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ресттемплейт весьма странный инструмент. но для обмена джейсонами сойдет.. тебе принципиально именно ресттемплейт? апач хттп клиент не хочешь попробовать?
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583807
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreykaT,

А что в нем странного такого?

Так то я готов в принципе и на http client, но не хотелось бы потому что по проекту везде resttemplate
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583832
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner
Код: java
1.
2.
3.
...
map.add("file", new File("filePath");
...



Код: java
1.
map.add("file", new FileSystemResource("filePath"));



не?
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583841
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
questioner,

Вот мой код где довольно просто все разжевано

https://github.com/SVyatkin/ads-bdd/blob/master/src/test/java/com/ge/predix/labs/common/RestClient.java

Скопируйте себе код и пуляйте походу типо

Код: java
1.
rest.post(config.paths.prefix + "/asset", JsonMapper.toJson(list));
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583842
Sergunka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел, что Вы пытаетесь делать как-то не обнаружил, что Вы пытались открыть стриминг для файла. Вы походу должны глянуть на этот пример

http://www.logicbig.com/tutorials/spring-framework/spring-integration/rest-template-file-upload/

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
public class UploadClient {

  public static void main(String[] args) throws IOException {
      MultiValueMap<String, Object> bodyMap = new LinkedMultiValueMap<>();
      bodyMap.add("user-file", getUserFileResource());
      HttpHeaders headers = new HttpHeaders();
      headers.setContentType(MediaType.MULTIPART_FORM_DATA);
      HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(bodyMap, headers);

      RestTemplate restTemplate = new RestTemplate();
      ResponseEntity<String> response = restTemplate.exchange("http://localhost:8080/upload",
              HttpMethod.POST, requestEntity, String.class);
      System.out.println("response status: " + response.getStatusCode());
      System.out.println("response body: " + response.getBody());
  }

  public static Resource getUserFileResource() throws IOException {
      //todo replace tempFile with a real file
      Path tempFile = Files.createTempFile("upload-test-file", ".txt");
      Files.write(tempFile, "some test content...\nline1\nline2".getBytes());
      System.out.println("uploading: " + tempFile);
      File file = tempFile.toFile();
      //to upload in-memory bytes use ByteArrayResource instead
      return new FileSystemResource(file);
  }
}
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39583899
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Андрей Панфиловquestioner
Код: java
1.
2.
3.
...
map.add("file", new File("filePath");
...



Код: java
1.
map.add("file", new FileSystemResource("filePath"));



не?

Да!

спасибо большое
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39586876
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В продолжении темы написал я:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
...
try {
    ResponseEntity<String> result = restTemplate.exchange(buildUrl(), HttpMethod.POST, requestEntity, String.class);
} catch (HttpStatusCodeException e) {            
    String response = e.getResponseBodyAsString();
    logger.error("Error during attachment push for file: {}, responseText: {}", fileNameWithPath, response, e);
    EmailMessage.ATTACHMENT_PUSH_WAS_NOT_SUCCESSFUL.send(
    new AttachmentPushWasNotSuccessfulMessageParameters(url, e.getStatusCode().value(), response, fileNameWithPath));
    return false;
}



И действительно в случае если использовать File вместо FileSystemResource, то я попадаю в этот кетч блок.

Но в случае если, скажем сделать URL некорректным(добавить лишнюю букву в конец), то летит другой эксепшн:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
org.springframework.web.client.ResourceAccessException: I/O error on POST request for "https://external_server.ventures/api/v1/push_file1": Software caused connection abort: socket write error; nested exception is java.net.SocketException: Software caused connection abort: socket write error
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:666)
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:531)
    at some.package.GenericDataServiceImpl.pushAttachment(GenericDataServiceImpl.java:310)
    at some.package.UploadRoutesDefinition.lambda$configure$1(UploadRoutesDefinition.java:255)
    at org.apache.camel.processor.DelegateSyncProcessor.process(DelegateSyncProcessor.java:63)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
    at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:80)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:176)
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:452)
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:219)
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:183)
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)



из этого эксепшена не достать ни http статус код ни response body.

В случае отсыла такого же сообщения с использованием постмана - естественно получаем 404

Как написать такой код, который всегда вернет респонс body и статус?

Все методы RestTemplate декларированы throws RestClientException, где нет таких данных?

Как добиться получения ответа и статуса для любого запроса?
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39586878
questioner
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RestTemplate инициализирован таким образом:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        CloseableHttpClient httpClient
                = HttpClients.custom()
                .setSSLHostnameVerifier(new NoopHostnameVerifier())
                .build();
        HttpComponentsClientHttpRequestFactory requestFactory
                = new HttpComponentsClientHttpRequestFactory();
        requestFactory.setHttpClient(httpClient);
        restTemplate = new RestTemplate(requestFactory);
...
Рейтинг: 0 / 0
Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
    #39587296
redwhite90
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причём это то воспроизводится, то не воспроизводится.

Головоломистая херь какая-то
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как через RestTemplate отправить такой же запрос как и через Postman?(MULTIPART_FORM_DATA)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]