91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Jersey中使用Restful接口獲取參數

發布時間:2021-06-07 18:14:10 來源:億速云 閱讀:495 作者:Leah 欄目:開發技術

如何在Jersey中使用Restful接口獲取參數?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

1.@PathParam

使用該注釋獲取參數時可以獲取URI中制定規則的參數

例如:

//該類的路徑為/user
@GET
@Path("{username"})
@Produces(MediaType.APPLICATION_JSON)
public User getUser(@PathParam("username") String userName) {
 ...}

當瀏覽器請求

http://localhost:8080/user/jack

時,username的值就是jack。請注意,這里的username并不是說key的值就是username,value是jack,而是說/user/后面就跟著username,這里的username只是一個變量。

2.@QueryParam

該參數用于獲取Get請求中的查詢參數,他和上一個的區別是它是通過URI中的?符號來實現的。

比如:

@GET
@Path("/user")
@Produces("text/plain")
public User getUser(@QueryParam("name") String name, @QueryParam("age") int age) { 
...}

當url的請求是

http://localhost:8080/user?name=cesar&age=21

時,此時函數獲取的參數就是name=cesar而age=21;

3.@FormPara

顧名思義,是從Post請求的表單中獲取數據。

@POST
@Consumes("application/x-www-form-urlencoded")
publicvoid post(@FormParam("name") String name) { 
// Store the message
}

4.默認參數值DefaultValue

當你希望在函數獲取參數時參數有一個默認值,那么就可以使用該注釋,它的使用方法如下

@GET
@Path("/user")
@Produces("text/plain")
public User getUser(@QueryParam("name") String name, @DefaultValue("26") @QueryParam("age") int age) { 
...}

那么當請求age參數時如果age沒有賦值,就會默認為26.

5.使用Map的參數@Context

在一個大型的server中,由于參數的多變,參數結構的調整很容易遇到問題,這時候就可以考慮使用@Context來進行注釋了。例子如下:

@GET
public String get(@Context UriInfo ui) { 
 MultivaluedMap<String, String> queryParams = ui.getQueryParameters(); 
MultivaluedMap<String, String> pathParams = ui.getPathParameters();
}

從例子中我們可以看出,其實Context就是其他幾個參數的集合而已,只要熟練掌握了這幾種參數以及他們代表的意義,你就可以熟練的操作Jersey了!

Restful接口傳入多參數的問題及解決方案

結論:

restful風格的接口不支持多個參數

注:本文指的是通過json序列化參數的情況

1. 前置

一個定義用來測試的MyParam類

public class MyParam {
    private String str;
    private Integer integer;
    // 省略 getter和setter……
    }

我在做測試的是用了Chrome的插件Advanced REST client,可以模擬瀏覽器發送各種請求,并自定義header和body。

測試的時候需要使用post方式,并在http請求header中加入

accept: application/json
content-type: application/json

然后在htpp請求的Body中,輸入json格式的參數,如{"str":"bb","integer":3}。

以下是幾種多參數接口的形式,以及輸入參數,以及解析結果。

2. 第一種:兩個String參數

@POST
@Path("demo")
public Result function(String param1, String param2);

傳入的參數:

{"param1":"bb","param2":"cc"}

解析出來的參數:

param1: "{"param1":"bb","param2":"cc"}"

param2: ""

這樣的風格,傳輸過來的參數,讀取的時候會讀取request body中的inputStream,然后兩個參數循環解析,解析完第一個參數的時候,會關閉inputStream,第二個參數再去讀取inputStream的時候,讀取到的就是空。

這樣的話,傳入的參數全部會賦值給第一個String對象,而第二個String解析出來后就是空字符串。

3. 第二種:一個對象參數,一個String參數

對于 第一個參數是封裝對象的情況,能解析出來第一個對象,而第二個參數也是拿不到。

這種情況下不會報錯,只是解析第一個對象的時候沒有問題,解析第二個String拿到的就是空字符串。

@POST
@Path("demo")
@Consumes({MediaType.JSON})
public Result function(MyParam myParam, String param);

傳入的參數:

{"str":"helo","integer":2},"string":"test"

解析出來的參數:

param1: 能正確解析對象myParam,其兩個屬性能正確賦值。

param2: ""

4. 第三種:一個String參數,一個對象參數

如果把兩個參數的位置交換,則會把傳入的參數全部解析給第一個String,而解析第二個對象的時候,由于拿到的數據是空,所以會報錯。如下:

@POST
@Path("demo")
public Result function(String param, MyParam myParam);

傳入的參數:

{"str":"helo","integer":2},"string":"test"

解析出來的參數:

param1: "{"str":"helo","integer":2},"string":"test""

param2: 會報錯

5.解決方法

要解決傳入多個參數的問題,有幾個思路:

1. 封裝對象,把要傳的多個參數封裝成一個對象傳入

2. 在訪問路徑中嵌入變量,使用@PathVariable注解,在請求路徑中寫 “/demo/{1}/{2}”,然后在請求路徑中相應的位置替換為要穿的參數即可,這種也只適用于包裝類,如String。

3. 改變請求的content type,使用content-type: application/x-www-form-urlencoded,這種使用form表單提交的形式,可以傳入兩個參數,要結合使用@FormParam注解

6.關于使用form形式傳入參數

接口的定義形式要修改

@POST
@Path("demo")
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
public Result function(@FormParam(value="string1")String string1, @FormParam(value="string2")String string2);

請求時,header參數要修改

accept: application/json
content-type: application/x-www-form-urlencoded

請求Body中使用form形式

string1=wo&string2=kan

然后就可以正確解析到兩個參數的值

解析出來的參數:

string1: wo

string2: kan

看完上述內容,你們掌握如何在Jersey中使用Restful接口獲取參數的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黑河市| 中江县| 长寿区| 龙里县| 敦煌市| 砚山县| 东城区| 扎鲁特旗| 宁武县| 芦山县| 阿拉善左旗| 南涧| 上林县| 客服| 南靖县| 无锡市| 南京市| 儋州市| 辽宁省| 鹤壁市| 屏边| 榆树市| 日照市| 小金县| 彭阳县| 墨玉县| 东乡族自治县| 宁国市| 武平县| 呼伦贝尔市| 阿拉善左旗| 修水县| 抚远县| 台中市| 宾川县| 永丰县| 都兰县| 陆河县| 固镇县| 维西| 开封县|