動態

詳情 返回 返回

[Java] 一個少見的get請求發送 (生成特殊格式的url) - 動態 詳情

記錄用java後端(spring boot)發送一個特殊的GET請求時遇到的問題

特殊的GET請求: 形如 http://target.domain.com?params={id: 22, name: "Mike"}

上面這個特殊的GET請求,無論是下面哪種格式(雙引號是否完全),在postman以及瀏覽器中都能正常獲取數據
http://target.domain.com?params={id: 22, name: "Mike"}
http://target.domain.com?params={id: "22", name: "Mike"}
http://target.domain.com?params={"id": "22", "name": "Mike"}

但是在spring boot後端用restTemplate發get請求總是失敗。

嘗試:

  1. 直接拼接url, 結果失敗。 報錯 Not enough variables available to expand
    restTemplate會認為 http://target.domain.com?params={xxx} 花括號中的值是一個變量,讓我們提供變量。 (即使提供了,還是失敗)
  2. 把params=後面的部分 {id: 22, name: "Mike"} 轉為json string,再拼接到等號後面,依然失敗。 (to json string + encode 依然失敗)

3、使用UriComponentsBuilder 創建URI類型的地址, 成功。

代碼見圖
image.png

使用
image.png

控制枱輸出的結果是下面的樣子
http://target.domain.com?params=%7B%22name%22:%22Mike%22,%22id%22:%2212%22%7D

全部的key, value都加上了雙引號", 且做了encode處理。

再進一步:
如果想要發送一個 http://target.domain.com?params={ids: [12, 13], name: "Mike"} 這樣的get請求

代碼整體結構不用改,入參類型變更。將getUriTypeWithJsonParams
方法的第3個參數 Map<String, String> params 定義變更為 Map<String, Object> params。
image.png

最終控制枱輸出結果是
http://map.google.com?params=%7B%22name%22:%22Mike%22,%22ids%22:[12,13]%7D

補充:
如果想要在本地非spring boot項目中運行上面的代碼,需要在項目中添加
spring-core-5.3.22.jar
spring-web-5.3.22.jar
這兩個依賴

完結。

同步更新到自己的語雀
https://www.yuque.com/dirackeeko/wxkg90/md27vy6z938kcg4h

user avatar wuyagege 頭像 wqjiao 頭像 baidusecrity 頭像 nanchengfe 頭像 jibvxiz 頭像 yils_lin 頭像 yayu 頭像 qiuzhisijiaoniannian 頭像 kylebing 頭像 tinyang 頭像 tangge 頭像 xingxingshangdelizhi 頭像
點贊 14 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.