[英]Jersey RESTful Services: Resources & Responses
我看到很多基於澤西島的Web服務由1個以上的WebResources
組成,這些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.
}
}
Response
對POJO的Response
? 看看我上面的2個getFizz
方法。 我何時返回Fizz
,何時返回Response
? 術語“資源”並不僅僅是澤西島術語,因為它是一個REST術語。 在處理REST時,我們有資源和表示 。 資源可以是任何東西,在這種情況下,它是位於服務器上的某個對象,具有URL位置。 當客戶端請求資源時,我們會發回它的表示。 你問:
“資源”和數據庫之間是否存在關系? 一張桌子? 一個POJO?
它可能是一個數據庫(這是一件事)。 我們可以簡單地將其表示為具有數據庫名稱的JSON對象。 它也可能是一張桌子(這是一件事)。 我們可以將它表示為具有名稱和列名稱的JSON對象。 它可以是表中的一行,我們可以使用JSON對象來表示該行,其中列名稱作為鍵,行值作為JSON值。 它可以是一個網頁,一個圖像,等等。 所以希望你明白資源可以是任何東西 。 我們發回的是它的代表。
但術語資源不僅限於將某些內容返回給客戶端請求。 客戶端還可以向我們發送資源的表示,例如創建新資源(POST)或更改現有資源(PUT)。 客戶端可以在我們的數據庫中向我們發送行(資源)的JSON表示。
你什么時候
Response
對POJO的Response
? 看看我上面的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(...)
表示狀態代碼應為201 Created
,並且我們傳遞給created
方法的值是新創建的資源的位置。 此位置將設置為響應中的Location
標頭。 因此,我們可以說POST請求的路徑是http://blah.com/buzz
。 我們將發回是http://blah.com/buzz/100
,其中100
是buzzId
,而這個完整的URL是我們將如何訪問這些資源的嗡嗡聲說用GET requesst與注釋資源法說@GET @PATH("/buzz/{id}")
就GET
,通過Response
,我們可以做到
Fizz newFizz = fizzService.getFizz();
return Response.ok(newFizz).build(); // sends the Fizz as the entity body
這與從方法中返回newFizz
實際上並沒有多大區別,因為我們沒有對Response
執行任何特殊操作。 我們只是說狀態代碼應該是200 OK
並附加實體主體。 這是成功的GET請求通常會發生的情況。 因此,如果我們只是在成功獲取GET的情況下返回Fizz
而不是Response
,則框架將隱式附加200 OK狀態。
就個人而言,由於微調因素,我更願意返回Responses
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.