Jersey RESTful Services:Resources&回应

时间:2014-10-31 01:14:57

标签: java rest jersey jax-rs

我看到很多基于泽西岛的网络服务由1 + WebResources组成,其中包含1 +端点/方法,如下所示:

package com.myws.fizz;
public class FizzResource {
    @GET
    @Path("/fizz/{id}")
    public Response getFizzById(@PathParam("id") Long id) {
        // ...etc.
    }

    @GET
    @Path("/fizz")
    public Fizz getFizzByFoo(Foo foo) {
        // ...etc.
    }
}

package com.myws.buzz;
public class BuzzResource {
    @POST
    @Path("/buzz")
    public Response createBuzz(Buzz buzz) {
        // ...etc.
    }
}
  • 我对泽西认为的资源"感到困惑。是否有资源"和一个数据库?一张桌子?一个POJO?
  • 您何时返回Response与POJO?看看我上面的2个getFizz方法。我何时返回Fizz,何时返回Response

1 个答案:

答案 0 :(得分:7)

术语"资源" 不仅仅是泽西语术语,因为它是一个REST术语。在处理REST时,我们有资源表示。资源可以是任何东西,在这种情况下,它是位于服务器上的某个对象,具有URL位置。当客户端请求资源时,我们会发回它的表示。你问:

  

a"资源"之间是否存在关系?和一个数据库?一张桌子?一个POJO?

可能是一个数据库(这是一件事)。我们可以简单地将其表示为具有数据库名称的JSON对象。此外,它可以成为一个表(这是一件事)。我们可以将它表示为具有名称和列名称的JSON对象。它可能是表中的一行,我们可以使用JSON对象来表示该行,其中列名作为键,行值作为JSON值。它可以是一个网页,一个图像,等等。所以希望你明白资源可以任何。我们寄回的是它的代表性。

但是术语资源不仅限于将某些内容返回给客户端请求。客户端还可以发送我们的资源表示,比如创建新资源(POST)或更改现有资源(PUT)。客户端可以在我们的数据库中向我们发送行(资源)的JSON表示。

  

什么时候返回Response与POJO?看看我上面的2个getFizz方法。我何时返回Fizz,何时返回Response

返回Response可让您微调Response。当客户提出请求时,他们总是会收到回复。响应具有标头和实体主体。当资源方法的返回类型为Fizz时,您说实体主体类型将是Fizz类型。当方法返回时,实际发生的是Fizz对象不是直接返回到请求客户端,所有这些都是自己的。在幕后,它被包裹在Response中,并被发送回客户端。框架将设置合适的标题。

因此,无论我们决定是返回Response还是Fizz,它都将包含在Response中。就像我说的,当我们返回Response时,它允许我们微调Response,添加我们自己的标题,状态代码等。例如,假设有人制作POST。你可以做点什么

@POST
@Path("/buzz")
@Produces(...)
public Response createBuzz(Buzz buzz, @Context UriInfo uriInfo) {
    int buzzID = // create buzz and get the resource id
    UriBuilder builder = uriInfo.getAbsolutePathBuilder();
    builder.path(Integer.toString(buzzId));  // concatenate the id.
    return Response.created(builder.build()).build();
}

基本上它的作用是创建资源,比如在数据库中,我们得到一个返回id。我们可以使用id连接到id的URI,这将是新的资源位置。就Response而言,.created(...)表示status code应为201 Created,而我们传递给created方法的值是新创建的资源。此位置将设置为响应中的Location标头。所以我们假设POST请求的路径是http://blah.com/buzz。我们要发回的是http://blah.com/buzz/100,其中100buzzId,这个完整的URL是我们将如何访问buzz资源,如果是GET请求者,请注意使用say注释的资源方法@GET @PATH("/buzz/{id}")

对于GETResponse,我们可以

Fizz newFizz = fizzService.getFizz();
return Response.ok(newFizz).build();  // sends the Fizz as the entity body

这与从方法中返回newFizz并没有多大区别,因为我们不会对Response做任何特别的事情。我们只是说状态代码应为200 OK并附加实体正文。这是成功的GET请求通常会发生的情况。因此,如果我们只返回Fizz而不是Response,则在成功获取GET的情况下,框架将隐式附加200 OK状态。

就个人而言,由于微调因素,我更愿意返回Responses