Netflix Feign 发起 PUT 请求

PUT 请求是一种用于向服务器上传资源的方法。它与 POST 请求有相似之处,都可以用于向服务器发送数据,但 PUT 请求更强调对指定资源的完整更新。也就是说,如果请求的目标资源已经存在,PUT 会用请求中包含的数据完全替换目标资源的现有内容;如果目标资源不存在,则会根据请求中的数据创建一个新的资源。

例如,假设有一个在线文档编辑系统,当用户通过 PUT 请求更新一篇文档时,服务器会使用请求中的新文档内容替换掉原来存储的文档内容。如果用户 PUT 请求的文档在服务器上还不存在,服务器会根据请求内容创建一个新的文档。

PUT 方法的格式为:

PUT <请求URL> HTTP/协议版本

例如:

PUT /api/documents/123 HTTP/1.1

其中,PUT 是请求方法,/api/documents/123 是请求的资源路径(这里假设文档资源有一个 ID 为 123),HTTP/1.1 是协议版本。

传统风格示例

准备工作

完整代码请参考“Netflix Feign 准备工作”章节的 UserController.java 类,下面将提供一个 PUT 服务,用于更新用户信息,如下:

// PUT 请求,更新用户信息
@PutMapping("/updateUser")
public CommonReturn<User> updateUser(@RequestParam("id") Long id, @RequestBody User updatedUser) {
    log.info("updateUser() id={}, updateUser={}", id, updatedUser);
    for (int i = 0; i < USERS.size(); i++) {
        if (USERS.get(i).getId().equals(id)) {
            USERS.set(i, updatedUser);
            return CommonReturn.success(updatedUser).ext(appName, appPort);
        }
    }
    return CommonReturn.fail("更新用户信息失败");
}

编写 Feign 客户端

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

public interface UserFeign {

    @RequestLine("PUT /user/updateUser?id={id}")
    @Headers("Content-Type: application/json")
    CommonReturn<User> updateUser(@Param("id") Long id, User updatedUser);

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

}

调用 Feign 客户端

完整代码请参考“Netflix Feign 准备工作”章节的 FeignController.java 类,下面仅仅给出了 demo5 方法的代码:

@RestController
public class FeignController {

    @GetMapping("/demo5")
    public CommonReturn<User> demo5(@RequestParam Long id, @RequestParam String name, @RequestParam Integer age) {
        return UserFeign.create().updateUser(id, User.builder().id(id).name(name).age(age).build());
    }

}

Restful 风格示例

准备工作

完整代码请参考“Netflix Feign 准备工作”章节的 UserRestfulController.java 类,下面将提供一个 PUT 服务,用于更新用户信息,如下:

// PUT 请求,更新用户信息
@PutMapping("/{id}")
public CommonReturn<User> updateUser(@PathVariable Long id, @RequestBody User updatedUser) {
    log.info("updateUser() id={}, updateUser={}", id, updatedUser);
    for (int i = 0; i < USERS.size(); i++) {
        if (USERS.get(i).getId().equals(id)) {
            USERS.set(i, updatedUser);
            return CommonReturn.success(updatedUser).ext(appName, appPort);
        }
    }
    return CommonReturn.fail("更新用户信息失败");
}

编写 Feign 客户端

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

public interface UserRestfulFeign {

    @RequestLine("PUT /user/restful/{id}")
    @Headers("Content-Type: application/json")
    CommonReturn<User> updateUser(@Param Long id, User updatedUser);

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

}

调用 Feign 客户端

完整代码请参考“Netflix Feign 准备工作”章节的 FeignController.java 类,下面仅仅给出了 demo10 方法的代码:

@RestController
public class FeignController {

    @GetMapping("/demo10")
    public CommonReturn<User> demo10(@RequestParam Long id, @RequestParam String name, @RequestParam Integer age) {
        return UserRestfulFeign.create().updateUser(id, User.builder().id(id).name(name).age(age).build());
    }

}


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