Сохранение изображения, возвращенного API в JSON - PullRequest
0 голосов
/ 18 марта 2019

Я использую API генератора мема .Моя цель - создавать мемы с помощью API, иметь возможность просматривать и сохранять их в виде изображений JPG.

Когда я пытаюсь использовать код Java, предоставленный создателем, я получаю сообщение об ошибке.

Вот предоставленный код, который завершается ошибкой:

  HttpResponse<JsonNode> response = Unirest.get("https://ronreiter-meme-generator.p.rapidapi.com/meme?font=Impact&font_size=50&meme=Condescending-Wonka&top=Yolo&bottom=HA")
      .header("X-RapidAPI-Key", "TOP_SECRET")
      .asJson();

Сообщение об ошибке:

org.springframework.beans.factory.UnsatisfiedDependencyException: Ошибка при создании компонента с именем 'APIController', определеннымв файле [C: \ yaml \ out \ production \ classes \ com \ example \ demo \ controllers \ APIController.class]: неудовлетворенная зависимость выражается через параметр конструктора 0;вложенным исключением является org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем 'APIService', определенным в файле [C: \ yaml \ out \ production \ classes \ com \ example \ demo \ services \ APIService.class]: реализациябобов не удалось;вложенным исключением является org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр [com.example.demo.services.APIService]: конструктор вызвал исключение;вложенным исключением является com.mashape.unirest.http.exceptions.UnirestException: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: текст JSONArray должен начинаться с '[' в 1 [символ 2, строка 1]

Он говорит, что поле

response

не может быть проанализировано как JSONArray, поэтому я попробовал этот фрагмент кода вместо этого:

  HttpResponse<String> meme = Unirest.get("https://ronreiter-meme-generator.p.rapidapi.com/meme?font=Impact&font_size=50&meme=Impossibru-Guy-Original&top=Random+meme&bottom=Bottom+text")
      .header("X-RapidAPI-Key", "TOP_SECRET")
      .asString();

В этом случаекод выполняется, но когда я вызываю конечную точку, я получаю множество фрагментов

ufffd

в строке, что в основном означает, что я пытаюсь прочитать код, которыйне имеет представления в Unicode.Я видел решение здесь , как я мог бы справиться с этой проблемой, но я не совсем уверен, что я иду правильным путем.

Согласно веб-сайту, на котором APIпри условии, я должен получить что-то вроде этого в ответ:

enter image description here

Не могли бы вы дать мне несколько советов, как подойти к этой проблеме?

Заранее спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Тип содержимого вашей спецификации API содержит "image / jpeg".Это означает, что ответ не содержит JSON, но содержит двоичные данные изображения, поэтому попытка проанализировать его как JSON приведет к сбою.

Попробуйте сохранить ответ из API непосредственно в файл, и вы увидите, чтоэто изображение.

0 голосов
/ 19 марта 2019

В конце концов я мог бы решить проблему с некоторой помощью. Вот оно:

HttpResponse httpResponse = Unirest.get("https://ronreiter-meme-generator.p.rapidapi.com/meme?font=Impact&font_size=50&meme=Condescending-Wonka&top=Top+text&bottom=Bottom+text")
        .header("X-RapidAPI-Key", "YOUR_SECRET_API_KEY")
        .asBinary();
InputStream inputStream = httpResponse.getRawBody();
BufferedImage imBuff = ImageIO.read(inputStream);
String filePath = "C:/x/x.jpg";
File file = new File(filePath);
ImageIO.write(imBuff, "jpg", file);

Итак, вот что нужно сделать:

  1. Получить ответ как двоичные данные
  2. Преобразовать его в InputStream
  3. Создать из него BufferedImage
  4. Создать файл с указанным filePath
  5. Запишите BufferedImage в файл
...