Groovy - 来自http URL的文件处理

时间:2013-12-11 10:03:07

标签: url groovy html-parsing

我们的一个服务器中的文件可以通过http访问。因此,当我们调出类似于以下内容的URL时,我们会获得该位置的文件/目录列表:

http://mytestserver/files/

从这个列表中,我只需要选择那些匹配正则表达式格式的文件。

如果这是磁盘中的一个位置,我可以使用eachFileMatch方法并过滤我需要的文件。

有人可以帮助我如何从http网址执行此操作吗?

4 个答案:

答案 0 :(得分:4)

@tim_yates的另一个版本使用JSoup

回答
@Grab(group='org.jsoup', module='jsoup', version='1.7.3')
import org.jsoup.Jsoup
def (doc,files, dirs) = [Jsoup.connect('http://central.maven.org/maven2/com/bloidonia/groovy-stream/').get(),[],[]]
doc.select("pre > a").each{href ->
    def filename = href.text()
    filename.endsWith("/")?dirs.add(filename):files.add(filename)
}
println """DIRECTORIES : 
${dirs.join('\n')}
FILES : 
${files.join('\n')}
"""

答案 1 :(得分:3)

不,您需要对返回的HTML进行一些解析。

以此页面为例:http://central.maven.org/maven2/com/bloidonia/groovy-stream/

我们需要做类似的事情:

@Grab( 'org.ccil.cowan.tagsoup:tagsoup:1.2.1' )

def url = 'http://central.maven.org/maven2/com/bloidonia/groovy-stream/'.toURL()

new XmlSlurper( new org.ccil.cowan.tagsoup.Parser() ).parseText( url.text )
                                                     .body
                                                     .pre
                                                     .a
                                                     .each { link ->
    if( link.@href.text().endsWith( '/' ) ) {
        println "FOLDER : ${link.text()}"
    }
    else {
        println "FILE   : ${link.text()}"
    }
}

打印出来:

FOLDER : ../
FOLDER : 0.5.1/
FOLDER : 0.5.2/
FOLDER : 0.5.3/
FOLDER : 0.5.4/
FOLDER : 0.6/
FOLDER : 0.6.1/
FOLDER : 0.6.2/
FILE   : maven-metadata.xml
FILE   : maven-metadata.xml.md5
FILE   : maven-metadata.xml.sha1

显然,您需要调整body.pre.a位以匹配目录列表的网络服务器输出

答案 2 :(得分:0)

如果您想提供文件,我认为将FTP服务器放在那里要好得多。

除非您的HTTP服务器支持已知的文件服务协议,例如WebDAV,否则您将不得不跳过一些环节将其用作文件服务器。

您需要使用HTTP客户端,例如Groovy HttpBuilder

当您向该URL发出请求时,您的HTTP服务器会返回响应。如果您启用了目录列表,那么大多数HTTP服务器将返回一个HTML页面,为您提供指向该目录中文件和子目录的链接。

您需要解析该HTML响应,可能使用一些正则表达式从中提取您想要的文件链接。

但是每个HTTP服务器都以自己的格式返回此类列表,因此您必须使其适应服务器使用的格式。

答案 3 :(得分:0)

使用https的Grooveek代码的expadnded版本并提供cookie以访问登录/密码后面的webdavs:

@Grab(group='org.jsoup', module='jsoup', version='1.7.3')
import org.jsoup.Jsoup

import javax.net.ssl.HostnameVerifier
import javax.net.ssl.HttpsURLConnection
import javax.net.ssl.SSLContext
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager

def nullTrustManager = [
checkClientTrusted: { chain, authType ->  },
checkServerTrusted: { chain, authType ->  },
getAcceptedIssuers: { null }
]

def nullHostnameVerifier = [
verify: { hostname, session -> true }
]

SSLContext sc = SSLContext.getInstance("SSL")
sc.init(null, [nullTrustManager as X509TrustManager] as TrustManager[],     null)
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory())
HttpsURLConnection.setDefaultHostnameVerifier(nullHostnameVerifier as     HostnameVerifier)

def (doc,files,dirs)  = 
    [Jsoup.connect('https://webdav/address').cookie('JSESSIONID','XYZsessionid').get(),[],[]]
doc.select("[href]").each{href ->
    def filename = href.text()
    def path = href.attr('href')
    path.endsWith("/")?dirs.add(filename):files.add(filename)
    }
println """DIRECTORIES :
${dirs.join('\n')}
FILES : 
${files.join('\n')}
"""