gpt4 book ai didi

java - REST 子资源定位器

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:21:16 26 4
gpt4 key购买 nike

我正在通读 RESTful Java with JAX-RS 2.0, 2nd Edition 这本书,并且正在努力理解子资源定位器的工作原理,下面是所提供示例的简化版本。 p>

客户数据库资源类

@Path("/customers")
public class CustomerDatabaseResource {

@Path("{database}-db")
public CustomerResource getDatabase(@PathParam("database") String db) {
// find the instance based on the db parameter
CustomerResource resource = locateCustomerResource(db);
return resource;
}

protected CustomerResource locateCustomerResource(String db) {
...
}
}

客户资源类

public class CustomerResource {
private Map<Integer, Customer> customerDB =
new ConcurrentHashMap<Integer, Customer>();
private AtomicInteger idCounter = new AtomicInteger();

public CustomerResource(Map<Integer, Customer> customerDB)
{
this.customerDB = customerDB;
}

@GET
@Path("{id}")
@Produces("application/xml")
public StreamingOutput getCustomer(@PathParam("id") int id) {
...
}

所以我明白,当一个请求如 GET/customers/northamerica-db/333 进来时,将首先匹配方法 CustomerDatabaseResource.getDatabase() 根据位置,将创建 CustomerResource 的正确实例。

我不明白的是接下来会发生什么......

  1. 实例 resource 被返回,但返回到哪里?

  2. Web 服务如何知道然后使用 CustomerResource.getCustomer() 方法匹配和处理请求的剩余部分?我猜这是因为 CustomerDataBaseResource 类没有 @GET,但我真的不明白转换是如何发生的。

  3. 这是 RESTEasy 特有的吗?

最佳答案

  1. The instance resource gets returned, but returned to where?

它被返回到请求处理引擎并继续寻找匹配的方法(在返回资源对象中),就像任何其他请求一样。

  1. How does the web service know to then match and process the remaining part of the request with the method CustomerResource.getCustomer()? I guess this is because The CustomerDataBaseResource class doesn't have a @GET, but I don't really understand how the transition happens

资源定位器不应使用 Http 方法进行注释。这就是他们被称为定位器的原因。既然不是要调用的资源方法,就不应该注解。想象一下

public class CustomerResource {
@PUT
@Path("{id}")
public Response updateCustomer(Customer customer) {}
@POST
@Path("{id}")
public Response createCustomer(Customer customer) {}
}

如果 CustomerDataBaseResource.getDatabase() 要使用 Http 方法进行注释,那么我们将无法访问上述方法。定位器只需要 @Path,URI 匹配将从该路径开始继续。

/customers/database-us

一旦创建了CustomerResource,如果请求uri是/customers/database-us/123,那么现在下一个逻辑步骤就是找到一个匹配的资源方法基于 URI,因此将寻找与 123 匹配的带有 @Path 注释的内容。然后检查Http方法。

  1. Is this specific to RESTEasy?

遍历 jax-rs spec , 我没有看到任何关于子资源定位器的信息,但是 Jersey also implements this exact behavior .我读过你所指的书,据我所知,作者并没有真正深入了解任何特定于实现的内容,但确实提到了大多数实现者实现的共同特征,这不是规范的一部分。也许这就是其中之一。


更新

所以它在规范中。转到链接并下载规范。您将在 3.4.1 子资源 下找到所有内容,并在 3.7.2 请求匹配

中找到请求匹配的一些算法信息

关于java - REST 子资源定位器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28793029/

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