【问题标题】:How to build properly "PUT method" and do "intern request"?如何正确构建“PUT 方法”并执行“实习请求”?
【发布时间】:2020-06-11 15:16:25
【问题描述】:

我是 Spring 和 Java 的新手(我可能不会使用正确的词汇,尤其是英语),我正在尝试建立一个小型数据库。但我对 PUT 方法的语法有疑问。 (目前一切正常)

所以我有一个名为 GameEntity 的公共类,它包含一个 id、一个 name 和一个名为 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 相同,但只有 idname

这是GETPOST的映射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);
    }
}

现在,我可以“POST”一个 GameEntity 和一个 PlayerEntity,但我想要 PlayerEntity 创建到 GameEntity 中的 PlayerEntity 对象列表。

所以我想我将不得不“PUT”创建 GameEntity。但是我怎样才能“到达” PlayerEntity 呢?我可以做一些类似内部请求的事情吗?可能是什么语法? 做两个请求来创建两个对象并将一个放入另一个对象是最好的方法吗? 直到现在我还缺少什么吗?

我有点迷茫,任何建议都会有很大帮助!

提前致谢。

【问题讨论】:

    标签: java spring rest httprequest put


    【解决方案1】:

    如果两个对象都可以独立存在,那么它们都应该有一个 POST。我假设在创建游戏时您的播放器已经存在?在这种情况下,当您发布游戏时,您可以立即将玩家包含在其收藏中。

    如果需要更新玩家列表,有多种方式:

    1. PUT /game/{id} 包括所有玩家。请注意,理想情况下,PUT 应覆盖整个资源,因此应包含 Game 的所有字段。
    2. PUT /game/{id}/players 将以前的玩家列表替换为新玩家。再次 - 包括整个列表,但现在您不必发送游戏的所有字段。
    3. POST /game/{id}/player - 为游戏添加新玩家。这个是POST,因为这样的端点将不再是幂等的。如果你这样做,你还必须创建DELETE /game/{id}/players
    4. 如果是更复杂的操作,您可能需要考虑PATCH - 它可能是非幂等的,可以部分更新资源。

    前 3 个是 RESTful,最后一个不是 - 动词可能开始爬入 URI。

    一般而言,幂等架构更安全、更简单,因此您应该首先考虑第 2 个。如果它很复杂 - 第 3 个也可以。如果您认为它不起作用(例如由于性能下降或其他因素),那么您可以考虑第 4 个选项。

    【讨论】:

    • 这正是我所需要的,我最终使用了你给我的第三种方法:非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2017-04-29
    相关资源
    最近更新 更多