我具有一些REST API的播放器资源URI:
http://localhost:8080/player/3 ----> ID为3的播放器资源的URI
我有用于游戏资源的URI:
http://localhost:8080/player/3/games
http://localhost:8080/player/3/games/5 ---> id = 3的玩家(玩此游戏的玩家)的id = 5的游戏资源的URI。
在Spring框架中,我需要两个RestController,一个用于播放器资源,另一个用于游戏资源,但是使用@RequestMapping注释,我这样:
@RestController
@RequestMapping("${spring.data.rest.base-path}" + "/players")
public class PlayerRestResource {
@RequestMapping( method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public PlayerDto createPlayer(@RequestBody PlayerDTO newPlayerDTO) {
...
}
....
}
但是我不知道如何对像这样的gameRestResource使用RequestMapping注释并获得玩家的ID:
@RestController
@RequestMapping("${spring.data.rest.base-path}" + "/player/idplayer/games")
public class GameRestResource {
@RequestMapping( method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public GameDto createGame(@RequestBody GameDTO newGameDTO) {
...
}
....
}
答案 0 :(得分:1)
您必须在方法而非类上添加特定的映射。
为了保持一致,您应该在路径中使用单数或复数名词。例如。玩家与玩家或游戏与游戏。我更喜欢单数名词作为我的休息服务-但这主要是一个主观意见。只要记住您的路径应该只包含名词而不能包含动词(创建,检索,更新等操作)。诸如GET,POST,PUT,DELETE之类的HTTP方法是您的操作,因此您的路径中不需要动词。
您可以通过不同的方法返回资源。我建议您阅读此question
@RestController
@RequestMapping("${spring.data.rest.base-path}" + "/player")
public class PlayerRestResource {
//This method can be accessed from /player/3
//Id need to be placed in curly. 3 from url will be passed to the method
@RequestMapping(path = "/{playerId}", method = RequestMethod.POST)
//Use @PathVariable to bind the value from to url to the method parameter.
public ResponseEntity<Player> getPlayer(@PathVariable("playerId") int playerId) {
}
//This is just like the above method.
//This method can be accessed from /player/3/game/5
@RequestMapping(path = "/{playerId}/game/{gameId}" method = RequestMethod.POST)
public ResponseEntity<List<Game>> getGame(@PathVariable("playerId) int playerId, @PathVariable("gameId) int gameId) {
}
}
格式化休息服务的速成课程。
您始终希望在自己的道路上立足。基本变量应该是您的基本实体。
创建新播放器-有效载荷可以在正文中格式化为JSON
POST: example.com/player
获取有关ID为3的玩家的信息。
GET: example.com/player/3
有关ID为3的玩家的更新信息-有效载荷可以在主体中格式化为JSON
PUT: example.com/player/3
删除ID为3的播放器
DELETE: example.com/player/3
获取与ID 3的玩家相关联的ID 5的游戏的信息。请注意,此路径应用于为特定用户更新特定玩家的数据
GET: example.com/player/3/game/5
创建新游戏-正文中的有效载荷可以设置为JSON格式
POST: example.com/game
获取有关ID为5的游戏的信息-此数据未与任何玩家相关联。这只是ID为5的特定游戏的数据。
GET: example.com/player/5
所有以/ player开头的路径都应该进入PlayerController类,而所有以/ game开头的路径都应该在GameController类中。
我建议您阅读以下资源:
https://martinfowler.com/articles/richardsonMaturityModel.html