保存 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);
所以这里是要做的事情:
- 将响应检索为二进制数据
- 将其转换为 InputStream
- 从中创建一个 BufferedImage
- 使用指定的文件路径创建文件
- 将BufferedImage写入文件
我正在使用 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);
所以这里是要做的事情:
- 将响应检索为二进制数据
- 将其转换为 InputStream
- 从中创建一个 BufferedImage
- 使用指定的文件路径创建文件
- 将BufferedImage写入文件