Как получить ответ на вызов API с помощью шаблона Rest, когда тип ответа неизвестен

У меня есть требование, согласно которому мне нужно получить ответ на различные результаты компании. Каждая компания предоставит мне REST API (со всеми подробностями для вызова API). Мне нужно прочитать определенный параметр из ответа. Параметр будет известен мне заранее и может отличаться для каждого API.

Поскольку ответ для всех API будет разным, я ищу общий метод вызова URL-адреса (всегда GET), анализа ответа в формате JSON и чтения выходного параметра.

Я попробовал сделать следующее:

String response = restTemplate.getForObject(URL,request,String.class);

Но это не позволяет вызвать API. Я также попробовал сделать:

Object response = restTemplate.getForObject(URL,request,Object.class);

и

JsonNode response = restTemplate.getForObject(URL,request,JsonNode.class);

Это тоже не работает. Есть ли другой способ вызвать API, преобразовать его ответ в объект JSON и прочитать определенное свойство JSON.

Я не эксперт, но возможно ли это на Java (я сделал что-то подобное с JS, но, конечно, там гораздо более расслабленные типы данных).

Спасибо за любые материалы.

что значит не работает? можешь опубликовать ошибку?

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

Ответы 1

Ответ принят как подходящий

Это всегда работало для меня:

String jsonStr = restTemplate.getForObject (
  "/search?keywords = {keywords}",
  String.class,
  "my search string"
);

Обратите внимание на совпадение заполнителя {keywords} и третьего параметра Java.

Ваши примеры выглядят подозрительно, поскольку у них есть объект запроса в методе getForObject(). Последний отправляет запрос GET, и передача объекта запроса в таком HTTP-запросе необычна. Фактически, подпись метода: getForObject(url, responseType, urlVariables) и другие варианты, в которых нет запроса на отправку.

Итак, либо у вас на самом деле нет объекта запроса (только параметры URL), либо у вас есть методы POST, для которых требуется restTemplate.postForObject(), либо, что маловероятно, у вас есть метод GET, который принимает полезную нагрузку в запросе.

У Spring нет варианта getForObject() для последнего случая, потому что, как уже было сказано, это необычно. Если у вас действительно есть такой метод и вы или другие не хотите превращать его в метод POST (а им следует это сделать), у вас должна быть возможность отправить такой странный запрос через RestTemplate.exchange() или .execute(), но я никогда этого не пробовал. .

Если у вас есть правильный метод и вызов, вариант с запросом JsonNode тоже должен работать.

Я думал, что это сработает для меня, но я считаю, что String.class не работает, если тип ответа — application/json. В моем случае все API отвечают Content-Type: application/json.

Saurabh Tiwari 01.05.2024 08:46
String.class должен привести к преобразованию JSON (или любого другого вывода) в строку, проблема, похоже, в этом запросе, который вы передаете GET. Покажите нам детали для получения дополнительной помощи.
zakmck 01.05.2024 18:32

Хорошо, проблема с моим кодом заключалась в том, что API, который я пытался использовать, ожидал определенных заголовков. Параметр request в моем getForObject был тем, что я пытался передать некоторые заголовки (код создания заголовков отсутствует в исходном вопросе). В конце концов я попробовал использовать собственный базовый API, и ваш код работает для него.

Saurabh Tiwari 02.05.2024 19:39

RestTemplate.exchange() или .execute() — это вызовы нижнего уровня, которые должны позволять устанавливать такие детали, как заголовки.

zakmck 03.05.2024 12:46

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