【问题标题】:Posting a resource with ManyToOne relationship发布具有多对一关系的资源
【发布时间】:2019-08-22 08:11:23
【问题描述】:

这个问题主要是关于如何设计一个 rest API 和什么是最佳实践。我正在尝试找出 POST 服务的 REST 端点,请考虑以下示例代码:

class Person {
    String name;
    @OneToMany
    List<Address> addresses;
}

class Address {
    String someAttribute;
    @ManyToOne
    Person person;
}

要添加一个新的Address,其余端点可能类似于POST api/**v1**/address。主要问题在于RequestBody,因为我们只有Personid,所以我们需要像下面这样传递json:

{
    "someAttribute": "someValue"
    "personId": 1
}

Controller 方法中,我们不能简单地使用@RequestBody Address address 作为Rest 端点方法的参数,因为Address 类中没有personId

我想了解这里的最佳做法是什么以及 Rest 端点应该如何?

PS:上面的代码是一个虚拟代码,只是为了方便解释问题。

更新

为避免混淆,我更新了端点 url。

【问题讨论】:

  • api/1/address 中的数字 1 指的是 WITH ID = 1 的人
  • @SpringerF 1 是api版本。
  • 所以在这里您必须将 id 作为路径参数传递并正确发送地址,否则如果您想尊重架构,您必须将人员作为对象发送到地址(获取所有人员信息作为人员键)

标签: spring rest post spring-restcontroller many-to-one


【解决方案1】:

请通过 Spring API 中的@PathVariables 注解。

使用@PathVariables,您可以从 URL 中获取 person_id 和 address_id。

创建一个人(最初有 n 个地址)

POST api/{api_version}/person

更新人员(仅更新人员详细信息而非地址)

PUT api/{api_version}/person/{person_id}

为人员添加新地址

POST api/{api_version}/person/{person_id}/addresses 

更新现有人员地址

PUT api/{api_version}/person/{person_id}/addresses/{address_id}

类结构

class Address {
    Integer id; 
    String someAttribute;
}
class Person {
    Long id;
    String name;
    @OneToMany
    List<Address> addresses;
}

示例资源实施

@RequestMapping(value="api/{api_version}/person/{person_id}/addresses/{address_id}", method = RequestMethod.PUT)

public ResponseEntity<ApiCustomResponse> updateAddress(
@PathVariable("person_id") Long person_id,
@PathVariable("address_id") Integer address_id, @RequestBody Address address) {

...

}

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2017-11-10
    • 2017-10-28
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多