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());
}
}