Отправьте тело JSON в HTTP-запросе GET при загрузке Java / Spring - PullRequest
0 голосов
/ 13 января 2020

Мне нужно отправить запрос GET с телом json при загрузке Java / Spring. Мне известны советы против этого, однако я должен был сделать это по нескольким причинам: 1. Используемый мной сторонний API разрешает только запросы GET, поэтому POST не вариант. 2. Мне нужно передать очень большой параметр в теле (список из 8-10 тысяч символов, разделенных запятыми), поэтому добавление параметров запроса в URL также не вариант.

Я пробовал несколько разные вещи:

  1. apache HttpClient отсюда: Отправка тела содержимого с HTTP-запросом GET в Java. Это дало некоторую ошибку непосредственно от самого API о плохом ключе.

  2. URIComponentsBuilder отсюда: Spring RestTemplate GET с параметрами . Это просто добавило параметры в URL, что, как я объяснил ранее, не вариант.

  3. restTemplate.exchange. Это казалось самым простым, но объект не прошел: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html#exchange - java .lang.String-org.springframework.http.HttpMethod-org.springframework.http.HttpEntity- java .lang .Class- java .util.Map-

, а также, вероятно, еще одна или две вещи, о которых я забыл.

Вот что я говорю в Почтальоне . Я должен быть в состоянии передать оба параметра, приведенные здесь. Он работает нормально, если работает через Postman, но я не могу понять это в Java / Spring Boot.

Вот фрагмент кода из попытки restTemplate.exchange:

public String makeMMSICall(String uri, List<String> MMSIBatchList, HashMap<String, String> headersList) {
    ResponseEntity<String> result = null;
    try {
        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        for (String key : headersList.keySet()) {
            headers.add(key, headersList.get(key));
        }

        Map<String, String> params = new HashMap<String, String>();
        params.put("mmsi", String.join(",", MMSIBatchList));
        params.put("limit", mmsiBatchSize);

        HttpEntity<?> entity = new HttpEntity<>(headers);
        result = restTemplate.exchange(uri, HttpMethod.GET, entity, String.class, params);

        System.out.println(result.getBody());

    } catch (RestClientException e) {
        LOGGER.error("Exception in makeGetHTTPCall :" + e.getMessage());
        throw e;
    } catch (Exception e) {
        LOGGER.error("Exception in makeGetHTTPCall :" + e.getMessage());
        throw e;
    }
    return result.getBody();
}

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Попробуйте создать новый пользовательский RequestFactory. Аналогично получить запрос с телом

0 голосов
/ 13 января 2020

Вы можете попробовать java.net.HttpUrlConnection, у меня это работает, но на самом деле я обычно использую POST

HttpURLConnection connection = null;
BufferedReader reader = null;
String payload = "body";

try {

    URL url = new URL("url endpoint");

    if (url.getProtocol().equalsIgnoreCase("https")) {
        connection = (HttpsURLConnection) url.openConnection();
    } else {
        connection = (HttpURLConnection) url.openConnection();
    }
    //  Set connection properties
    connection.setRequestMethod(method); // get or post
    connection.setReadTimeout(3 * 1000);
    connection.setDoOutput(true);
    connection.setUseCaches(false);        

    if (payload != null) {
        OutputStream os = connection.getOutputStream();

        os.write(payload.getBytes(StandardCharsets.UTF_8));

        os.flush();
        os.close();
    }

    int responseCode = connection.getResponseCode();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...