Netflix Feign 发起 GET 请求

GET 请求是一种从指定资源请求数据的方法。它用于获取信息,就像是向服务器发送一个 “请把这个资源的数据给我” 的请求。例如,当你在浏览器中输入一个网址并回车时,浏览器通常会发送一个 HTTP GET 请求到服务器,以获取该网页的内容。

GET 请求的格式相对简单。它的请求行包含了请求方法(GET)、请求的 URL(统一资源定位符)和 HTTP 协议版本。例如:

GET /index.html HTTP/1.1

其中,GET 是请求方法,/index.html 是请求的资源路径,HTTP/1.1 是协议版本。

下面将介绍如何通过 Netflix Feign 发起 GET 请求。

传统风格示例

准备工作

完整代码请参考“Netflix Feign 准备工作”章节的 UserController.java 类,下面将提供无参数和有参数的 GET 请求服务:

// 无参数
// GET 请求,获取所有用户信息
@GetMapping("/getAllUsers")
public CommonReturn<List<User>> getAllUsers() {
    log.info("getAllUsers()");
    return CommonReturn.success(USERS).ext(appName, appPort);
}

// 有参数
// 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 客户端

根据上面提供的服务接口信息,编写一个 Feign 客户端:

public interface UserFeign {

    // 无参数请求
    @RequestLine("GET /user/getAllUsers")
    CommonReturn<List<User>> getAllUsers();

    // 有参数请求
    @RequestLine("GET /user/getUserById?id={id}")
    CommonReturn<User> getUserById(@Param("id") Long id);

    // 创建Feign客户端实例的静态方法
    static UserFeign create() {
        return Feign.builder()
        .encoder(new JacksonEncoder())
        .decoder(new JacksonDecoder())
        .contract(new Contract.Default())
        .target(UserFeign.class, "http://localhost:8090/");
    }

}

注意:上面代码中 @Param 注解将在后续章节介绍,该注解用来声明一个参数,然后在 @RequestLine 注解中通过“{name}”方式引用。

调用 Feign 客户端

此时,可以直接使用 UserFeign.create() 静态方法创建一个 UserFeign 客户端的实例,调用对应的方法,实现 HTTP 请求,例如:

@RestController
public class FeignController {

    @GetMapping("/demo2")
    public CommonReturn<List<User>> demo2() {
        return UserFeign.create().getAllUsers();
    }

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

}

上面示例中,通过 UserFeign.create().getAllUsers() 和 UserFeign.create().getUserById(id) 发起了对 /user/getAllUsers 和 /user/getUserById?id= 接口的调用。

Restful 风格示例

准备工作

完整代码请参考“Netflix Feign 准备工作”章节的 UserRestfulController.java 类,下面将提供有参数的 Restful 格式的 GET 请求服务:

// Restful 风格
// GET 请求,根据用户 ID 获取用户信息
@GetMapping("/{id}")
public CommonReturn<User> getUserById(@PathVariable 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 客户端

根据上面提供的服务接口信息,编写一个 Feign 客户端:

public interface UserRestfulFeign {

    // 在路径上引用了 @Param 注解修饰的参数
    @RequestLine("GET /user/restful/{id}")
    CommonReturn<User> getUserById(@Param("id") Long id);

    // 创建Feign客户端实例的静态方法
    static UserRestfulFeign create() {
        return Feign.builder()
        .encoder(new JacksonEncoder())
        .decoder(new JacksonDecoder())
        .contract(new Contract.Default())
        .target(UserRestfulFeign.class, "http://localhost:8090/");
    }

}

调用 Feign 客户端

在 FeignController 类中添加 demo8 方法,如下:

@RestController
public class FeignController {

    //...

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

}

注意:请确保被调用的服务正确启动。

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