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 客户端:
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/"); } }
完整代码请参考“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()); } }
完整代码请参考“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 客户端:
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/"); } }
完整代码请参考“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()); } }