如何获取imgbb上传接口返回JSON中data字段下的url值
问题排查与修复方案
1. JSON格式报错原因
你提供的示例JSON存在尾逗号不符合规范的问题:image、thumb、medium三个对象的最后一个url字段末尾多了多余的逗号,这不符合标准JSON语法要求,所以会触发POJO转换器的格式错误提示。实际生产环境imgbb官方返回的JSON不存在该尾逗号,若实际请求仍然报错,可先打印原始响应字符串确认返回内容是否正常:
// 临时用ResponseBody接收打印原始返回排查 String rawJson = response.body().string(); Log.d("原始响应", rawJson);
2. 接口定义错误修复
你的接口定义存在参数重复问题:@POST注解路径中已经写了&key=,后续又用@Query传key参数,会导致最终请求URL出现重复的key参数,同时路径写法不规范,修复后的接口代码如下:
public interface UploadApi { @Multipart @POST("/1/upload?expiration=100") Call<ResponseBody> uploadImage(@Query("key") String key, @Part MultipartBody.Part image); }
3. 响应解析逻辑实现
你当前直接用ResponseBody接收返回没有做JSON解析,自然无法提取url字段,可通过Gson转换器直接解析为POJO对象,步骤如下:
第一步 定义POJO类
// 根响应类 public class ImgbbResponse { private DataBean data; private boolean success; private int status; // 手动生成getter、setter方法 } // data字段对应的类 public class DataBean { private String id; private String title; private String url_viewer; private String url; private String display_url; private String size; private String time; private String expiration; private ImageBean image; private ThumbBean thumb; private MediumBean medium; private String delete_url; // 手动生成getter、setter方法 } // image、thumb、medium三个字段结构一致 public class ImageBean { private String filename; private String name; private String mime; private String extension; private String url; // 手动生成getter、setter方法 } public class ThumbBean extends ImageBean{} public class MediumBean extends ImageBean{}
第二步 改造Retrofit配置
在RetroClient初始化代码中添加Gson转换器:
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.imgbb.com/") .addConverterFactory(GsonConverterFactory.create()) // 保留你原有其他配置 .build();
第三步 改造请求逻辑
// 修改接口返回类型 public interface UploadApi { @Multipart @POST("/1/upload?expiration=100") Call<ImgbbResponse> uploadImage(@Query("key") String key, @Part MultipartBody.Part image); } // 修改请求回调逻辑 call.enqueue(new Callback<ImgbbResponse>() { @Override public void onResponse(Call<ImgbbResponse> call, Response<ImgbbResponse> response) { if (response.isSuccessful() && response.body() != null && response.body().isSuccess()) { Toast.makeText(context, "上传成功", Toast.LENGTH_SHORT).show(); // 直接获取图片直链 String directUrl = response.body().getData().getUrl(); // 后续可对直链做业务处理 } else { Toast.makeText(context, "上传失败,状态码:" + response.code(), Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<ImgbbResponse> call, Throwable t) { Toast.makeText(context, "请求失败:" + t.getMessage(), Toast.LENGTH_SHORT).show(); } });
其他小问题修复
你原有代码中的Toast没有调用.show()方法,即使请求成功也不会弹出提示,需要补充调用该方法。
内容的提问来源于stack exchange,提问作者hatoritotori
相关产品推荐
相关产品推荐

