想象一下,你有2个实体,玩家和团队,玩家可以在多个团队中.在我的数据模型中,我有一个每个实体的表,以及一个用于维护关系的连接表.Hibernate可以很好地处理这个问题,但是我如何在RESTful API中公开这种关系呢?
我可以想几个方面.首先,我可能让每个实体都包含另一个实体的列表,因此Player对象将拥有它所属的Teams列表,并且每个Team对象都有一个属于它的Players列表.因此,要向团队添加播放器,您只需将播放器的表示形式发布到端点,例如POST /player或POST /team,并将相应的对象作为请求的有效负载.这对我来说似乎是最"RESTful"但感觉有点奇怪.
/api/team/0:
{
name: 'Boston Celtics',
logo: '/img/Celtics.png',
players: [
'/api/player/20',
'/api/player/5',
'/api/player/34'
]
}
/api/player/20:
{
pk: 20,
name: 'Ray Allen',
birth: '1975-07-20T02:00:00Z',
team: '/api/team/0'
}
Run Code Online (Sandbox Code Playgroud)
我能想到的另一种方法就是将关系本身作为一种资源来揭露.因此,要查看给定团队中所有玩家的列表,您可以执行GET /playerteam/team/{id}或类似的操作并获取PlayerTeam实体列表.要将球员添加到球队,请/playerteam使用适当构建的PlayerTeam实体作为有效负载进行POST .
/api/team/0:
{
name: 'Boston Celtics',
logo: '/img/Celtics.png'
}
/api/player/20:
{
pk: 20,
name: 'Ray Allen',
birth: '1975-07-20T02:00:00Z',
team: '/api/team/0'
}
/api/player/team/0/:
[
'/api/player/20',
'/api/player/5',
'/api/player/34'
]
Run Code Online (Sandbox Code Playgroud)
这是什么最好的做法?
我有一个如下所示的Command类:
public class Command {
...
private String commandName;
private Object[] commandArgs;
...
public void executeCommand() {}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个Command,AuthenticateCommand的子类:
public class AuthenticateCommand extends Command {
...
@Override
public void executeCommand() {
...
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设一个类Server,它有一个方法processCommand(命令命令).它接受命令param,检查commandName字段,并使用该名称将命令强制转换为Command的子类,负责实现命令逻辑.在此示例中,您可能拥有一个CommandName,其commandName为"authenticate",而command和pw存储在commandArgs数组中.processCommand()会将Command强制转换为AutheticateCommand并调用executeCommand()方法.我试图用以下内容完成此任务(commandMap只是一个将commandName映射到其实现者类名的Map):
public void processCommand(Command command) {
String commandName = command.getCommandName();
String implementorClassString = commandMap.get(commandName);
try {
Class implementorClass = Class.forName(implementorClassString);
Object implementor = implementorClass.cast(command);
Method method = implementorClass.getDeclaredMethod("executeCommand", null);
method.invoke(implementor);
} catch (ClassNotFoundException e) {
logger.error("Could not find implementor class: " + implementorClassString, e);
} catch …Run Code Online (Sandbox Code Playgroud)