java - 如何正确构建“PUT 方法”并执行“实习请求”?
问题描述
我是 Spring 和 Java 的新手(我可能不会使用正确的词汇,尤其是英语),我正在尝试建立一个小型数据库。但是我对PUT方法的语法有疑问。 (现在一切正常)
所以我有一个名为GameEntity的公共类,它包含一个id、一个名称和一个名为PlayerEntity的对象列表 (我从 stackoverflow 帖子中删除了导入只是为了看得更清楚)
public class GameEntity {
@Id
@GeneratedValue
private Integer id;
private String name;
@OneToMany
private List<PlayerEntity> players;
public GameEntity() { }
public Integer getId() { return id; }
public void setId(Integer id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public List<PlayerEntity> getPlayers() { return players; }
public void setPlayers(List<PlayerEntity> players) { this.players = players; }
}
PlayerEntity对象的构建方式与GameEntity相同,但只有一个id和一个name。
这是GET和POST的映射 (与PlayerEntity相同):
@RestController
public class GameController {
private final GameRepository gameRepository;
public GameController(GameRepository gameRepository) {
this.gameRepository = gameRepository;
}
@GetMapping("/games")
public List<GameEntity> getAllGames() {
return this.gameRepository.findAll();
}
@PostMapping("/games")
public GameEntity createGame(@RequestBody GameEntity gameEntity) {
return this.gameRepository.save(gameEntity);
}
}
现在,我可以“发布”一个GameEntity和一个PlayerEntity,但我希望将PlayerEntity创建到 GameEntity 中的PlayerEntity对象列表中。
所以我想我将不得不“ PUT ”创建的GameEntity。但是我怎样才能“到达” PlayerEntity?我可以做一些类似内部请求的事情吗?可能是什么语法?做两个请求来创建两个对象并将一个放入另一个对象是最好的方法吗?直到现在我错过了什么吗?
我有点迷茫,任何建议都会有很大帮助!
提前致谢。
解决方案
如果两个对象都可以独立存在,那么它们都应该有一个 POST。我假设在创建游戏时您的播放器已经存在?在这种情况下,当您发布游戏时,您可以立即将玩家包含在其收藏中。
如果需要更新玩家列表,有多种方式:
PUT /game/{id}
包括所有玩家。请注意,理想情况下 PUT 应该覆盖整个资源,因此应该包含 Game 的所有字段。PUT /game/{id}/players
用新玩家替换以前的玩家列表。再次 - 包括整个列表,但现在您不必发送游戏的所有字段。POST /game/{id}/player
- 将新玩家添加到游戏中。这是POST
因为这样的端点将不再是幂等的。如果你这样做,你还必须创建DELETE /game/{id}/players
.- 如果您可能需要考虑更复杂的操作
PATCH
- 它可能是非幂等的并且可以部分更新资源。
前 3 个是 RESTful,最后一个不是 - 动词可能开始爬入 URI。
一般来说,幂等架构更安全、更简单,因此您应该首先考虑第 2 个。如果它很复杂 - #3 也可以。如果您认为它不起作用(例如由于性能下降或其他因素),那么您可以考虑第 4 个选项。
推荐阅读
- android - 如何使用 OkHttpClient 在 Kitkat 上下载 apk 文件
- azure - MarkLogic - 我们可以在 Azure Blob 上配置计划备份吗
- ios - “未定义的符号:_OBJC_CLASS__$_LCOpenSDK_PlayWindow”出错
- android - 尝试从 URI 上传图像文件时,该位置不存在对象
- linux - Electron breakpad minidump 版本不匹配
- eclipse - 使用 Eclipse 搜索的“OR”正则表达式
- c# - 两种语言的机器人
- sql-server - 为 BCP 实用程序创建查询时出现单引号问题
- linux - 如何根据标签将单个 XML 文件拆分为多个
- android - 如何将增量构建添加到 Dagger 2