从 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 读取(使用重定向)的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Xamarin Forms 中的 webview 拦截“重定向 URL”