2015-08-16 254 views
0

比方说,我有一些资源:REST - 链接资源,其他资源

/users 
/companies 

,并在我的数据模型我有两个实体和关系之间的许多一对多的关系,不是对称的(如用户可以说他为一家公司工作,但公司可能会或可能不会证实这一点)。

我想这样做的是这种关系的子资源,使

/users/:id/companies 

回报用户企业建模。

我的问题是,什么是正确的方式来管理2资源之间的其余交互?

问题1 - GET:

如果有人GET /用户/ X,我想返回类似:

{ 
    id: x, 
    name: y, 
    companies: WHAT SHOULD I PUT HERE?, 
    ... 
} 

我认为我能完成省略企业领域,或者说我可以只是把一个链接到真实资源

{ 
    id: x, 
    name: y, 
    companies: { 
     href: "https://stackoverflow.com/users/x/companies" 
    }, 
    ... 
} 

也许

{ 
    id: x, 
    name: y, 
    companies: [ 
     href: "https://stackoverflow.com/users/x/companies/a", 
     href: "https://stackoverflow.com/users/x/companies/b" 
    ], 
    ... 
} 

不同的解决办法是将返回公司

{ 
    id: x, 
    name: yyy, 
    companies: [{ 
     id: a, 
     name: zzz 
     link: "/user/x/companies/a" 
    }], 
    ... 
} 

这是否有道理的基本表示?也许这只有在明确询问请求时才有意义(类似/ users/x?embed = companies)?

其他解决方案来管理如何显示子资源?

问题2:POST

正如我写了作为一个独立的对象在这种情况下,子资源存在,所以例如当它连接到用户实体的公司实体已经存在。

我可以创建这种连接吗?

我的想法是只其建模为:

POST /users/:id/companies 
{companyId: a} 

甚至

POST /users/:id/companies 
[a, b, c] 
一个您喜欢哪种

这些策略是否由于某种原因过于简单或错误?

有什么我可能不会考虑?

用第一种方法创建多个链接的正确方法是什么?

我想要的另一件事是在用户创建时定义这些链接。是否有可能在一个请求上做?

POST /users/ 
{id: x, name: y, companies: [a,b,c]} 

我认为REST规范说你应该使用与期望的GET相同的表示来发布资源。这显然违反了这一原则。

对不起,很长的问题和任何英语错误。

非常感谢您的帮助。

+0

请添加用户和公司类的实现,就像您在这些类中拥有的所有成员一样。 – quintin

+0

真的有必要吗?我试图保持一切实现不可知且只考虑REST API。服务器处理请求的方式在这里应该没有关系。 – heapOverflow

+1

我不认为这是必要的。你对问题1的最后一种方法有什么问题?这看起来很好。用户获取有关公司的基本信息以及他可以调用的链接以了解公司的更多信息 - 因为多个用户可以为同一家公司工作,所以只有链接应该指向“/ company/{id}”IMO之类的内容。因此,在这种情况下,根资源很好。也许你可以按照HAL的方式呈现链接:'......,“_links”:{“self”:{“href”:“http:// ...”},...},...' –

回答

0

我Employee类这样的:

@JsonInclude(JsonInclude.Include.NON_NULL) 
@JsonPropertyOrder({ 
"displayName" 
}) 

public class Employee { 
@JsonProperty("id") 
int id; 

@JsonProperty("firstName") 
String firstName; 

@JsonProperty("company") 
Company company; 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public Company getCompany() { 
    return company; 
} 
public void setCompany(Company comp) { 
    this.company = comp; 
} 

@Override 
public String toString() { 
    return "Employee [id=" + id + ", firstName=" + firstName + ", company=" 
      + company + "]"; 
} 
} 

公司:

public class Company { 

List<String> company; 

public List<String> getCompany() { 
    return company; 
} 

public void setCompany(List<String> company) { 
    this.company = company; 
} 
} 

POST:

@POST 
@Produces({"application/json"}) 
@Consumes({"application/json"}) 
public Employee CreateIt(Employee e) { 
    //Implementation 
} 

机构POST:

{ “公司”:{ “公司”: “谷歌”,为 “Adobe”, “亚马逊”]}, “名字”: “幔”, “ID”:101}

公司

{ “公司”:: “谷歌”,为 “Adobe”, “亚马逊”], “名字”:只是一个名字

@JsonInclude(JsonInclude.Include.NON_NULL) 
public class Employee { 
@JsonProperty("id") 
int id; 

@JsonProperty("firstName") 
String firstName; 

@JsonProperty("company") 
List<String> company; 

public List<String> getCompany() { 
    return company; 
} 

public void setCompany(List<String> company) { 
    this.company = company; 
} 

public int getId() { 
    return id; 
} 

public void setId(int id) { 
    this.id = id; 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

@Override 
public String toString() { 
    return "Employee [id=" + id + ", firstName=" + firstName + ", company=" 
      + company + "]"; 
} 
} 

POST体的名单 “蝙蝠人”, “id”:101}

+0

这里的公司只是一个名单的列表,而不是一个真正的实体。这不是我想要的。 – heapOverflow