【问题标题】:HTTPoison follow redirectsHTTPoison 跟随重定向
【发布时间】:2021-06-23 07:36:25
【问题描述】:

有一个公共 API 可以在浏览器中完美运行并返回 JSON 响应,但使用最新版本的 Httpoision 它无法按预期工作:

HTTP (GET) : https://yts.lt/api/v2/list_movies.json?query_term=tt11296058

 {:ok,
 %HTTPoison.Response{
   body: "",
   headers: [
     {"Date", "Tue, 22 Jun 2021 11:42:20 GMT"},
     {"Transfer-Encoding", "chunked"},
     {"Connection", "keep-alive"},
     {"Cache-Control", "max-age=3600"},
     {"Expires", "Tue, 22 Jun 2021 12:42:20 GMT"},
     {"Location",
      "https://yts.mx/api/v2/list_movies.json?query_term=tt11296058"},
     {"cf-request-id", "0ad5205cb800004da508b04000000001"},
     {"Expect-CT",
      "max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\""},
     {"Report-To",
      "{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v2?s=O80%2B5KfZ6d3G3Fz0NBGlep%2BetzQAvaUDIvVW09DUB2QMtJpd1XxupK621LhGR8EqiOsOY%2B55BdaHAljyLCEumHyb0rHSqk526jMQ5NxuLUi%2FVdbX\"}],\"group\":\"cf-nel\",\"max_age\":604800}"},
     {"NEL", "{\"report_to\":\"cf-nel\",\"max_age\":604800}"},
     {"Server", "cloudflare"},
     {"CF-RAY", "663536745c654da5-BOM"},
     {"alt-svc",
      "h3-27=\":443\"; ma=86400, h3-28=\":443\"; ma=86400, h3-29=\":443\"; ma=86400, h3=\":443\"; ma=86400"}
   ],
   request: %HTTPoison.Request{
     body: "",
     headers: [],
     method: :get,
     options: [],
     params: %{},
     url: "https://yts.lt/api/v2/list_movies.json?query_term=tt11296058"
   },
   request_url: "https://yts.lt/api/v2/list_movies.json?query_term=tt11296058",
   status_code: 301
 }}

还要指出 status_code 来自响应是 301。 301 是用于永久删除的资源,但这里似乎不是这种情况。

项目依赖:

Elixir: 1.12.1
OTP: 24
{:httpoison, "~> 1.8"},
{:floki, "~> 0.20.4"},
{:poison, "~> 3.1"},
{:hackney, github: "benoitc/hackney", override: true},

【问题讨论】:

    标签: redirect elixir httpoison


    【解决方案1】:

    您需要传递follow_redirect 选项:

    HTTPoison.get(url, [], follow_redirect: true)
    

    例子:

    iex(1)> Mix.install [:httpoison]
    :ok
    iex(2)> url = "https://yts.lt/api/v2/list_movies.json?query_term=tt11296058"
    "https://yts.lt/api/v2/list_movies.json?query_term=tt11296058"
    iex(3)> HTTPoison.get(url, [], follow_redirect: true)
    {:ok,
     %HTTPoison.Response{
       body: "{\"status\":\"ok\",\"status_message\":\"Query was successful\",\"data\":
    ...
    

    【讨论】:

      【解决方案2】:

      301 用于永久删除的资源

      绝对不是。这是redirection(“永久移动”的代码。)

      浏览器显然自己处理重定向,代码必须自己处理。收到301 后,您的代码应在指定位置重复请求。在您提供的响应中,响应中没有指定位置,这很奇怪,但这是另一个问题。


      HTTPoison 可以是 instructed to handle redirects

      【讨论】:

      • HTTPoision 不应该处理这个吗?
      • 我与HTTPoison作者没有任何关系,所以我无法回答这个关于它是否应该的特殊问题。关于如何使用HTTPoison 处理重定向,我现在将更新答案。
      猜你喜欢
      • 2012-01-05
      • 2020-04-15
      • 1970-01-01
      • 2023-03-12
      • 2012-05-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      相关资源
      最近更新 更多