一、業務場景
獲取類似http://120.0.0.1:8080/receiveState?timeStamp=1586937885&number=2這樣的請求uri中的某些參數
二、解決方法
處理思想:
根據uri字符串的規律,三次切割。第一次獲取路徑和多個參數連接字符串,繼續切割參數字符串,獲取單個參數鍵值對,最后切割鍵值對拿取參數值
import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; public class UriSplitTest { public static Map<String, List<String>> getQueryParams(String url) { try { Map<String, List<String>> params = new HashMap<String, List<String>>(); String[] urlParts = url.split("\\?");//這里分割uri成請求路徑和請求參數兩部分,注意這里的?不能直接作為分隔符,需要轉義
if (urlParts.length > 1) { String query = urlParts[1];//獲取到參數字符串
for (String param : query.split("&")) { String[] pair = param.split("="); String key = URLDecoder.decode(pair[0], "UTF-8"); String value = ""; if (pair.length > 1) { value = URLDecoder.decode(pair[1], "UTF-8"); } List<String> values = params.get(key); if (values == null) { values = new ArrayList<String>(); params.put(key, values); } values.add(value); } } return params; } catch (UnsupportedEncodingException ex) { throw new AssertionError(ex); } } public static void main(String[] args) { String uri = "http://120.0.0.1:8080/receiveState?timeStamp=1586937885&number=2"; Map<String, List<String>> params = getQueryParams(uri); System.out.println(params.toString());//{timeStamp=[1586937885], number=[2]} } }