У меня есть требование, согласно которому мне нужно получить ответ на различные результаты компании. Каждая компания предоставит мне 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, но, конечно, там гораздо более расслабленные типы данных).
Спасибо за любые материалы.
Это всегда работало для меня:
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.
String.class
должен привести к преобразованию JSON (или любого другого вывода) в строку, проблема, похоже, в этом запросе, который вы передаете GET. Покажите нам детали для получения дополнительной помощи.
Хорошо, проблема с моим кодом заключалась в том, что API, который я пытался использовать, ожидал определенных заголовков. Параметр request
в моем getForObject
был тем, что я пытался передать некоторые заголовки (код создания заголовков отсутствует в исходном вопросе). В конце концов я попробовал использовать собственный базовый API, и ваш код работает для него.
RestTemplate.exchange() или .execute() — это вызовы нижнего уровня, которые должны позволять устанавливать такие детали, как заголовки.
что значит не работает? можешь опубликовать ошибку?