2015-09-24 3 views
1

мне нужно, чтобы разобрать URL-адреса, которые могут содержать протоколы, отличающиеся от http или https ... и с тех пор, если попытаться создать java.net.URL объект с URL, как nio://localhost:61616 сбои конструктора, я ве реализовано что-то вроде этого:Scala: Как разобрать URL с помощью пользовательских протоколов

def parseURL(spec: String): (String, String, Int, String) = { 
    import java.net.URL 

    var protocol: String = null 

    val url = spec.split("://") match { 
    case parts if parts.length > 1 => 
     protocol = parts(0) 
     new URL(if (protocol == "http" || protocol == "https") spec else "http://" + parts(1)) 
    case _ => new URL("http" + spec.dropWhile(_ == '/')) 
    } 

    var port = url.getPort; if (port < 0) port = url.getDefaultPort 
    (protocol, url.getHost, port, url.getFile) 
} 

в случае, если данный URL содержит протокол, отличный от http или https, я сохранить его в переменной, а затем я заставляю http позволить java.net.URL разобрать его без сбоев.

Есть ли более элегантный способ решить эту проблему?

+2

У вас есть причина, по которой вы не можете использовать 'java.net.URI' вместо' java.net.URL'? http://stackoverflow.com/questions/2406518/why-does-javas-url-class-not-recognize-certain-protocols – ymonad

+0

Да ... это работает. Спасибо, я не понял ;-) – j3d

ответ

7

Вы можете использовать java.net.URI для любого нестандартного протокола.

new java.net.URI("nio://localhost:61616").getScheme() // returns nio 

Если вы хотите более Scala, как API, вы можете проверить https://github.com/NET-A-PORTER/scala-uri.