HTTPoison follow redirects

1.1k Views Asked by At

There is a public API that perfectly works in the browser and returns the JSON response but using the latest version of Httpoision It does not work as expected:

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
 }}

Also to point out the status_code is coming from the response is 301. 301 is for a resource that is permanently removed, but it seems that is not the case here.

project dependencies:

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

There are 2 best solutions below

2
On BEST ANSWER

301 is for a resource that is permanently removed

Absolutely not. This is a redirection (code for “Moved Permanently.”)

The browser obviously handles redirections itself, the code must handle it on its own. Upon receiving 301 your code should repeat the request by the location specified. In the response you provided, there is no location specified in the response, which is weird, but that’s another issue.


HTTPoison can be instructed to handle redirects, though.

0
On

You need to pass the follow_redirect option:

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

Example:

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\":
...