Извлечь ключ, значение params из ресурсов URL - PullRequest
0 голосов
/ 14 сентября 2018

Привет всем. Я работаю со следующим URL-адресом, и мне нужно получить параметры key-values ​​из этого URL-адреса, URL-адрес может быть в следующих форматах:

http://www.espn.com/watch/?gameId=1234&league=nfl&lang=es. В этом случае я использую следующую логику:

def parseUrlStringToMap( def url )
{
    def mapResult
    if ( url.contains( "&" ) || url.contains( "?" ) )
    {
        mapResult = url?.split( '\\?' )[ 1 ]?.split( '&' )?.inject( [:] ) { map, token ->
            token?.split( '=' )?.with { map[ it[ 0 ] ] = it[ 1 ] }
            map
        }
    }
    //Here I have to implement the logic for the second type of url
    def params = new URL( url ).getQuery()
    return mapResult
}

и второй формат без параметров:

http://www.espn.com/fantasy/story/_/id/24664478/fantasy-soccer-la-liga-fantasy-transfer-market-matchweek-4.

Мне нужно извлечь карту с помощью [id: 24664478]. Я пытался использовать подстроку. Знаете ли вы, есть ли изощренный способ сделать это без использования подстроки?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018
import java.nio.file.Paths

def u=new URL("http://www.espn.com/fantasy/story/id/24664478/fantasy-soccer-la-liga-fantasy-transfer-market-matchweek-4")
def p = Paths.get(u.getPath())

println p[2]
println p[3]

печать

id
24664478
0 голосов
/ 14 сентября 2018

Вы могли бы сделать что-то вроде этого ... Я предполагаю, что _ обозначает, что следующие 2 элемента являются парой ключ / значение ... Я также изменил код для обработки нескольких значений в параметре запроса (т.е.: 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'))
...