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

从Groovy中的URL读取(带重定向),groovy,http-status-code-301,http-redirect,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') 对于相同的URL,curl也返回空的,但是curl-L返回我想要的XML。 Groovy是否有类似于-L选项的东西 -L:如果

此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')
对于相同的URL,curl也返回空的,但是curl-L返回我想要的XML。 Groovy是否有类似于-L选项的东西

-L:如果服务器报告请求的页面已移动到另一个位置,该位置由location:标头和3XX响应代码指示,则此选项将使curl在新位置上重做请求

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
}

代码可以在上下载。

您是否有机会尝试此解决方案?对你有用吗?