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

Java Feign客户端如何从Giphy接口JSON响应提取GIF URL列表

Feign调用Giphy接口提取指定GIF链接列表实现方案

以下方案基于Java生态最常用的Spring Cloud OpenFeign实现,不需要映射全量响应字段,代码量小适合初学者。

前置准备

  • 在项目中引入OpenFeign依赖,Maven坐标如下:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 在Spring Boot启动类上添加@EnableFeignClients注解,开启Feign自动装配。

最简实现(无需定义多层DTO)

不需要为Giphy返回的复杂JSON编写全量实体类,直接用Jackson的JsonNode接收响应,按路径提取目标字段即可,是最适合快速开发的方式。

  1. 定义Feign客户端接口
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.fasterxml.jackson.databind.JsonNode;

@FeignClient(name = "giphyClient", url = "https://api.giphy.com")
public interface GiphyFeignClient {
    @GetMapping("/v1/gifs/search")
    JsonNode searchGifs(@RequestParam("api_key") String apiKey, @RequestParam("q") String keyword);
}
  1. 编写业务逻辑提取URL

注意:Giphy官方接口实际返回的原图节点名称为original,如果你确认目标接口返回节点名是origin,把代码路径中的original替换为origin即可。

import jakarta.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;

public class GiphyService {
    private static final String API_KEY = "WXpCt1X1tDwup2N1YRcBqfI38edEvweb";

    @Resource
    private GiphyFeignClient giphyFeignClient;

    public List<String> getTargetGifUrls() {
        JsonNode response = giphyFeignClient.searchGifs(API_KEY, "rich");
        List<String> urlList = new ArrayList<>();
        JsonNode dataArray = response.get("data");
        if (dataArray == null || !dataArray.isArray()) {
            return urlList;
        }
        for (JsonNode dataItem : dataArray) {
            // 直接按JSON路径取值,避免逐层get的空指针问题
            JsonNode urlNode = dataItem.at("/images/original/url");
            if (!urlNode.isMissingNode() && urlNode.asText() != null) {
                urlList.add(urlNode.asText());
            }
        }
        return urlList;
    }
}

可选:DTO映射方式实现

如果你更习惯用强类型DTO接收响应,不需要定义所有返回字段,只保留你需要的层级字段即可,Jackson反序列化时会自动忽略不存在的字段。

  1. 定义精简版DTO,仅保留目标路径相关字段:
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.List;

@Data
public class GiphySearchResp {
    private List<GifItem> data;
}

@Data
public class GifItem {
    private ImageNode images;
}

@Data
public class ImageNode {
    // 如果接口返回节点名是origin,直接把注解里的值改成"origin"即可
    @JsonProperty("original")
    private ImageItem origin;
}

@Data
public class ImageItem {
    private String url;
}
  1. 修改Feign接口返回值为GiphySearchResp,业务层遍历收集URL即可:
import java.util.Objects;

@FeignClient(name = "giphyClient", url = "https://api.giphy.com")
public interface GiphyFeignClient {
    @GetMapping("/v1/gifs/search")
    GiphySearchResp searchGifs(@RequestParam("api_key") String apiKey, @RequestParam("q") String keyword);
}

// 业务层提取逻辑
public List<String> getTargetGifUrls() {
    GiphySearchResp resp = giphyFeignClient.searchGifs(API_KEY, "rich");
    return resp.getData().stream()
            .map(item -> item.getImages().getOrigin().getUrl())
            .filter(Objects::nonNull)
            .toList();
}

注意事项

  • 正式使用时建议添加异常捕获,处理接口鉴权失败、调用超限、网络超时等异常场景
  • 如果使用非Spring生态的原生Feign,核心逻辑一致:直接将响应解析为树模型按路径取值,或者映射为仅含目标字段的DTO即可,不需要处理冗余的返回字段

内容的提问来源于stack exchange,提问作者alex_us

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:54:25