You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:09:04