OpenFeign 发起 GET 请求

HTTP(超文本传输协议)中的 GET 请求是一种从服务器获取数据的请求方法。它是最常用的 HTTP 请求方法之一,主要用于向服务器请求资源,这些资源可以是网页、图片、文件等各种数据。

@GetMapping是 Spring 框架中的一个注解,用于将 HTTP GET 请求映射到特定的处理方法上。它是 @RequestMapping(method=RequestMethod.GET) 的缩写,使得在编写 RESTful API 端点或者调用外部服务(在 OpenFeign 中)时更加简洁和方便。

注意:完整代码请参考 Spring Cloud OpenFeign 入门示例

发起 GET 请求

无参数 GET

服务端代码:

@GetMapping("/hello")
public String hello(HttpServletRequest request) {
    return "Hello World";
}

定义Feign客户端:

@GetMapping("/simple/hello")
String get();

调用Feign客户端:

@GetMapping("/get1")
public String get1() {
    return simpleFeign.get();
}

调用结果:

image.png

带参数 GET

服务端代码:

@GetMapping("/get")
public String get(@RequestParam("id") Long id) {
    return "appName=" + appName + " appPort=" + appPort + " id=" + id;
}

定义Feign客户端:

@GetMapping("/simple/get")
String get(@RequestParam("id") Long id);

调用Feign客户端:

@GetMapping("/get2")
public String get2(@RequestParam("id") Long id) {
    return simpleFeign.get(id);
}

调用结果:

image.png

GET 返回复杂对象

服务端代码:

// GET 请求,根据用户 ID 获取用户信息
@GetMapping("/getUserById")
public CommonReturn<User> getUserById(@RequestParam("id") Long id) {
    log.info("getUserById() id={}", id);
    return USERS.stream()
            .filter(user -> user.getId().equals(id))
            .findFirst()
            .map(u -> CommonReturn.success(u).ext(appName, appPort))
            .orElse(CommonReturn.fail("用户不存在"));
}

定义Feign客户端:

@GetMapping("/user/getUserById")
CommonReturn<User> getUserById(@RequestParam("id") Long id);

调用Feign客户端:

@GetMapping("/getUserById")
public CommonReturn<User> getUserById(@RequestParam("id") Long id) {
    return userFeign.getUserById(id);
}

调用结果:

image.png

参数传递与绑定

路径变量(Path Variable) 

路径变量是通过 @PathVariable 注解来处理的。在服务提供方和 OpenFeign 客户端的接口方法中,路径变量的名称和位置都需要保持一致。如果路径中有多个变量,例如 /books/{bookId}/chapters/{chapterId},可以这样定义:

// 服务提供方
@GetMapping("/books/{bookId}/chapters/{chapterId}")
public String getChapter(@PathVariable("bookId") String bookId, @PathVariable("chapterId") String chapterId) {
    // 业务逻辑
    return "";
}

// OpenFeign 客户端
@GetMapping("/books/{bookId}/chapters/{chapterId}")
String getChapter(@PathVariable("bookId") String bookId, @PathVariable("chapterId") String chapterId);

请求参数(Request Parameter)

除了路径变量,GET 请求还经常使用请求参数。例如,获取某一类型的图书列表,接口路径可能是/ books?type=fiction。在服务提供方可以这样写:

// 服务提供方
@GetMapping("/books")
public List<String> getBooksByType(@RequestParam("type") String type) {
    List<String> result = new ArrayList<>();
    // 根据type筛选books并添加到result
    return result;
}

// OpenFeign 客户端
@GetMapping("/books")
List<String> getBooksByType(@RequestParam("type") String type);

返回值处理

在 OpenFeign 中,服务调用方接口方法的返回值类型应该和服务提供方对应方法的返回值类型在逻辑上是匹配的。

例如,如果服务提供方返回一个 JSON 格式的数据(如 Book 对象),服务调用方接口方法也应该能够接收和处理这个 JSON 数据对应的 Java 对象(假设已经配置了合适的 JSON 序列化和反序列化机制)。

如果服务提供方返回一个简单的字符串或者数值,服务调用方也应该相应地定义匹配的返回值类型。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号