gpt4 book ai didi

java - JAX-RS RESTful API 使用 JSON 表示和链接资源

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:01 26 4
gpt4 key购买 nike

有时,我应该如何在 RESTful API 中链接资源会感到困惑,例如考虑实体:

个人资料(用户可以创建包含地址、详细信息等的企业资料。)

计划(已保存在应用程序的数据库中,由管理员创建)

创建配置文件的请求如下所示:

POST /profiles
{
"name": "Business name",
"address": "The address",
"phone": "0000000000"
}

现在要求配置文件属于定价计划。那么使用 JSON 执行这样的 POST 请求是个好主意吗?

POST /profiles
{
"name": "Business name",
"address": "The address",
"phone": "0000000000"
"plan": {
"id": 1
}
}

然后通过提供的id加载计划并将其与正在创建的配置文件关联:

@POST
@Path("/profiles")
public Response createProfile(Profile profile) {

// load plan resource from DB
Plan plan = em.find(Plan.class, profile.getPlan().getId())

// associate
profile.setPlan(plan);

// persist profile
em.perist(profile);
}

配置文件实体:

@Entity
public class Profile implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "plan_id", nullable = false)
private Plan plan;

private String name
...

// getters and setters

}

计划实体:

@Entity
public class Plan implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Column(nullable = false)
private String name;

@NotNull
@Column(nullable = false, columnDefinition = "text")
private String description;

@NotNull
@Column(nullable = false, precision = 8, scale = 2)
private BigDecimal price;

@NotNull
@Column(nullable = false)
private Integer days;

@OneToMany(fetch = FetchType.LAZY, mappedBy="plan", cascade = CascadeType.ALL)
private List<Profile> profiles;

...

}

换句话说,我在问应该将什么传递给请求正文才能链接引用实体。

我愿意相信这样的事情更合理:

POST /plans/1/profiles

但是根据 REST 和 JSON 语义,最好的选择是什么?

我还可以考虑其他方法,例如提供计划 ID 作为查询参数:

POST /profiles?planId=1

最佳答案

我想说你需要执行以下操作:

创建个人资料

POST: /profile

分配计划

PUT: /profile/<profile_id>
{
"name": <optional>,
"plan_id": <optional>,
...
}

第一件事是将创建和更新(POST/PUT)分开。另一个是您在 URL 中指定要更新的个人资料 ID。

您可以在PUT请求体中设置需要更新的参数,并且只更新已设置的参数。认为 REST 概念很好。

关于java - JAX-RS RESTful API 使用 JSON 表示和链接资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31254410/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com