保存 JSON 中 API 返回的图像

Saving an image returned by an API in JSON

我正在使用 Meme generator 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: Error creating bean with name 'APIController' defined in file [C:\yaml\out\production\classes\com\example\demo\controllers\APIController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'APIService' defined in file [C:\yaml\out\production\classes\com\example\demo\services\APIService.class]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.example.demo.services.APIService]: Constructor threw exception; nested exception is com.mashape.unirest.http.exceptions.UnirestException: java.lang.RuntimeException: java.lang.RuntimeException: org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 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 中没有表示的代码。我已经看到了一个解决方案 here 如何处理这个问题,但我不太确定我的方法是否正确。

根据提供 API 的网站,我应该得到这样的回复:

你能给我一些解决这个问题的建议吗?

提前感谢您的帮助。

您的 API 规范的内容类型包含 "image/jpeg"。 这意味着响应不包含 JSON,而是二进制图像数据,因此尝试将其解析为 JSON 将导致失败。

尝试将您 API 的回复直接保存到文件中,您会看到它是一张图片。

最终我可以在一些帮助下解决问题。 这是:

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. 使用指定的文件路径创建文件
  5. 将BufferedImage写入文件