我如何使用Scala Dispatch获取301重定向返回的URL?

8
我正在使用Scala的dispatch HTTP库,版本为0.10.1。我向返回HTTP 301永久重定向的URL发出请求。例如,http://wikipedia.com返回一个301,重定向到http://www.wikipedia.org/。我该如何使用dispatch获取重定向后的URL?
按照教程,我已经完成了以下步骤。
import dispatch._, Defaults._
val svc = url("http://wikipedia.com")
val r = Http(svc OK as.String)
r()

这会抛出一个“意外的响应状态: 301”的异常。可能需要查询重定向URL的r值,或者在其定义中指定一些除OK以外的参数,但我无法从文档中找到解决方法。

调度程序从0.8到0.9再到0.10发生了很大变化,因此您应该说明您正在使用哪个版本。 - Randall Schulz
更新了原始问题。我正在使用最新和最棒的版本。 - W.P. McNeill
2个回答

11

配置底层asyncClient以跟随重定向:

val r = Http.configure(_ setFollowRedirects true)(svc OK as.String)

获取重定向的URL:

val svc = url("http://wikipedia.com/")
val r = Http(svc > (x => x))
val res = r()

println(res.getHeader("Location"))

可以了。现在我怎样从 r 中获取实际的新 URL http://www.wikipedia.org/ 呢? - W.P. McNeill
你也可以写成 def redir(s:String) = {val r = Http(url(s) > (x => x.getHeader("Location")));r()} - W.P. McNeill
如果 setFollowRedirects 对您无效,请尝试使用 setFollowRedirect(不带末尾的s)代替。 - ffriend

0

分派/重新启动 v1.2.0:

  val myRequest = url(theUrl)
  
  def myGet = myRequest.GET
  def myGetFollowRedi = myGet.setFollowRedirects(true)

  def myRequestWithHeader = myGetFollowRedi <:< Map(
    "User-Agent" -> "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:94.0) Gecko/20100101 Firefox/94.",
    "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.",
    "Accept-Language" -> "de-DE,de;q=0.9,en-US;q=0.7,en;q=0.6,en-GB;q=0.4,nl-NL;q=0.3,nl;q=0.1",
    "Accept-Encoding" -> "gzip, deflate, br",
    "DNT" -> "1",
    "Connection" -> "keep-alive",
    "Upgrade-Insecure-Requests" -> "1",
    "Sec-Fetch-Dest" -> "document",
    "Sec-Fetch-Mode" -> "navigate",
    "Sec-Fetch-Site" -> "none",
    "Sec-Fetch-User" -> "?1"
  )

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接