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

Posted

技术标签:

【中文标题】从 Groovy 中的 URL 读取(使用重定向)【英文标题】:Read from URL in Groovy (with redirect) 【发布时间】:2017-02-04 16:41:49 【问题描述】:

这个 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 在新位置重做请求。

【问题讨论】:

【参考方案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下载。

【讨论】:

您有机会尝试这个解决方案吗?它对你有用吗?

以上是关于从 Groovy 中的 URL 读取(使用重定向)的主要内容,如果未能解决你的问题,请参考以下文章

使用 URL 中的请求参数从页面重定向

如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”

ajax与重定向

grails无法在此处发出重定向(..)。当url参数包含尖括号时,先前调用重定向(..)

从R中的url获取重定向的数量

从 .Net 应用程序中的 Web.config 重定向 URL