你可以这样做。。。我是这么想的
_
表示接下来的两个元素是键/值对。。。我还更改了代码以处理查询参数中的multile值(即:
k=a&k=b
)这是完全正确的。
def parseUrlStringToMap(URI uri) {
if (uri.query) {
uri.query.split('&')*.split("=").inject([:].withDefault { [] }) { m, v ->
m[v[0]] << v[1]
m
}.collectEntries { k, v -> v.size() == 1 ? [k, v[0]] : [k, v] }
} else {
// I'm going to assume that key/values come after '_' paths
def paths = uri.path.split('/')
paths[paths.findIndexValues { it == '_' }.collect { (it+1)..(it+2) }].collate(2).collectEntries()
}
}
println parseUrlStringToMap(URI.create('http://www.espn.com/watch/?gameId=1234&league=nfl&lang=es'))
println parseUrlStringToMap(URI.create('http://www.espn.com/fantasy/story/_/id/24664478/_/key/value/fantasy-soccer-la-liga-fantasy-transfer-market-matchweek-4'))