Jersey 請求參數探索

Jakarta EE,REST
Remote
1
09:12 AM · Dec 01 ,2025

1. 簡介

Jersey 是一個流行的 Java 框架,用於創建 RESTful Web 服務。

在本教程中,我們將探索如何通過一個簡單的 Jersey 項目讀取不同請求參數類型。

2. 項目設置使用 Maven 考古包,我們將能夠為我們的文章生成一個可運行的項目:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2
  -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false
  -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example
  -DarchetypeVersion=2.28

生成的 Jersey 項目將運行在 Grizzly 容器之上。

現在,默認情況下,我們的應用程序端點的 URL 是 http://localhost:8080/myapp

讓我們添加一個 items 資源,我們將用於我們的實驗:

@Path("items")
public class ItemsController {
    // 我們的端點在這裏定義
}

請注意,Jersey 與 Spring 控制器也很好地協同工作。

3. 註解參數類型

因此,在我們實際讀取請求參數之前,讓我們先澄清一些規則。允許的參數類型有:

  • 基本類型,如floatchar
  • 具有單個String參數構造函數的類型
  • 具有 either 一個 fromStringvalueOf 靜態方法;對於這些類型,單個 String 參數是強制性的
  • 集合 – 如ListSetSortedSet,這些集合的類型是上述類型

此外,我們可以註冊 ParamConverterProvider JAX-RS 擴展 SPI。返回值必須是一個ParamConverter實例,能夠從String類型進行轉換。

4. Cookies

我們可以使用 @CookieParam 註解在我們的 Jersey 方法中解析 Cookie 值:

@GET
public String jsessionid(@CookieParam("JSESSIONId") String jsessionId) {
    return "Cookie parameter value is [" + jsessionId+ "]";
}
如果啓動我們的容器,我們可以使用 cURL 訪問此端點以查看響應:
> curl --cookie "JSESSIONID=5BDA743FEBD1BAEFED12ECE124330923" http://localhost:8080/myapp/items
Cookie parameter value is [5BDA743FEBD1BAEFED12ECE124330923]

5. 標題

或者,我們可以使用 HTTP 頭部@HeaderParam 註解進行解析:

@GET
public String contentType(@HeaderParam("Content-Type") String contentType) {
    return "Header parameter value is [" + contentType+ "]";
}

讓我們再次測試:

> curl --header "Content-Type: text/html" http://localhost:8080/myapp/items
Header parameter value is [text/html]

6. 路徑參數

尤其是在 RESTful API 中,通常會包含在路徑中。

我們可以使用 @PathParam 來提取路徑元素:

@GET
@Path("/{id}")
public String itemId(@PathParam("id") Integer id) {
    return "路徑參數值是 [" + id + "]";
}

讓我們發送另一個 curl 命令,值為 3

> curl http://localhost:8080/myapp/items/3
路徑參數值是 [3]

7. 查詢參數

我們通常在 RESTful API 中使用查詢參數來提供可選信息。

要讀取這些值,我們可以使用 @QueryParam 註解:

@GET
public String itemName(@QueryParam("name") String name) {
    return "Query parameter value is [" + name + "]";
}

因此,我們可以像之前一樣使用 curl 測試:

> curl http://localhost:8080/myapp/items?name=Toaster
Query parameter value is [Toaster]

8. 表單參數

為了從表單提交中讀取參數,我們將使用 @FormParam 註解:
@POST
public String itemShipment(@FormParam("deliveryAddress") String deliveryAddress, 
  @FormParam("quantity") Long quantity) {
    return "表單參數是 [deliveryAddress=" + deliveryAddress+ ", quantity=" + quantity + "]";
}

我們還需要設置正確的 Content-Type 以模擬表單提交操作。 讓我們使用 -d 標誌來設置表單參數:

> curl -X POST -H 'Content-Type:application/x-www-form-urlencoded' \
  -d 'deliveryAddress=Washington nr 4&quantity=5' \
  http://localhost:8080/myapp/items
表單參數是 [deliveryAddress=Washington nr 4, quantity=5]

9. 矩陣參數

矩陣參數是一種更靈活的查詢參數,因為它們可以添加到 URL 的任何位置。

例如,在 http://localhost:8080/myapp;name=value/items 中,矩陣參數是 name

為了讀取這些值,我們可以使用可用的 @MatrixParam 註解:

@GET
public String itemColors(@MatrixParam("colors") List<String> colors) {
    return "Matrix parameter values are " + Arrays.toString(colors.toArray());
}

現在我們再次測試該端點:

> curl http://localhost:8080/myapp/items;colors=blue,red
Matrix parameter values are [blue,red]

10. Bean 參數

最後,我們將檢查如何使用 Bean 參數組合請求參數。 換句話説,Bean 參數實際上是一個對象,它將不同類型的請求參數組合在一起。

我們將在這裏使用一個 Header 參數、一個 Path 參數和一個 Form 參數:

public class ItemOrder {
    @HeaderParam("coupon")
    private String coupon;

    @PathParam("itemId")
    private Long itemId;

    @FormParam("total")
    private Double total;

    //getter and setter

    @Override
    public String toString() {
        return "ItemOrder {coupon=" + coupon + ", itemId=" + itemId + ", total=" + total + '}';
    }
}

此外,要獲取此類參數的組合,我們將使用 @BeanParam 註解:

@POST
@Path("/{itemId}")
public String itemOrder(@BeanParam ItemOrder itemOrder) {
    return itemOrder.toString();
}

curl 命令中,我們添加了這三種類型的參數,最終會得到一個單一的 ItemOrder 對象:

> curl -X POST -H 'Content-Type:application/x-www-form-urlencoded' \
  --header 'coupon:FREE10p' \
  -d total=70 \
  http://localhost:8080/myapp/items/28711
ItemOrder {coupon=FREE10p, itemId=28711, total=70}

11. 結論

總而言之,我們創建了一個簡單的 Jersey 項目設置,以便我們可以使用 Jersey 從請求中讀取不同參數。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.