从Groovy中的URL读取(带重定向)

时间:2016-09-27 07:00:32

标签: groovy http-status-code-301 http-redirect

这个Groovy代码输出一个空字符串:

def url = 'http://www.wikidata.org/w/api.php?action=wbgetentities&sites=enwiki&titles=Mozambique&format=xml&props='.toURL()
print url.getText('utf-8')

使用相同的网址,curl也会返回空,但curl -L会返回我想要的XML。
Groovy有什么东西与-L选项相似吗?

  

-L:如果服务器报告所请求的页面已移动到其他位置(用Location:标题和3XX响应代码表示),则此选项将使curl重做新地点的请求。

1 个答案:

答案 0 :(得分:1)

Groovy使用Java的HttpUrlConnection封面,它不会自动跟踪重定向。但是,这是一个小函数,它将通过检查响应的状态和位置标头并在必要时调用重定向的URL来为您处理它:

def findRealUrl(url) {
    HttpURLConnection conn = url.openConnection()
    conn.followRedirects = false
    conn.requestMethod = 'HEAD'
    if(conn.responseCode in [301,302]) {
        if (conn.headerFields.'Location') {
          return findRealUrl(conn.headerFields.Location.first().toURL())
        } else {
            throw new RuntimeException('Failed to follow redirect')
        }
    }
    return url
}

可以在GitHub上下载代码。