有一个公共 API 可以在浏览器中完美运行并返回 JSON 响应,但使用最新版本的 Httpoision 却无法正常工作:
HTTP (GET) : https://yts.lt/api/v2/list_movies.json?query_term=tt11296058
Elixir: 1.12.1
OTP: 24
{:httpoison, "~> 1.8"},
{:floki, "~> 0.20.4"},
{:poison, "~> 3.1"},
{:hackney, github: "benoitc/hackney", override: true},
还要指出 status_code 来自响应是 301。 301 是针对永久移除的资源,但这里似乎不是这种情况。
项目依赖:
REPLACE(json_build_array(adm_id),'"', '')
答案 0 :(得分:4)
您需要传递 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\":
...
答案 1 :(得分:3)
301 用于永久删除的资源
绝对不是。这是一个 redirection(“永久移动”的代码。)
浏览器显然自己处理重定向,代码必须自己处理。收到 SQL> select a.deptno, a.ename, b.job
2 from emp a cross join emp b
3 where 1 = 1
4 and (a.ename = b.ename or
5 a.job = b.job or
6 a.deptno = b.deptno or
7 a.sal = b.sal or
8 a.mgr = b.mgr
9 )
10 and (f_equal(a.ename , b.ename) +
11 f_equal(a.job , b.job) +
12 f_equal(a.deptno, b.deptno) +
13 f_equal(a.sal , b.sal) +
14 f_equal(a.mgr , b.mgr)
15 ) >= 3;
DEPTNO ENAME JOB
---------- ---------- ---------
20 SMITH CLERK
30 ALLEN SALESMAN
30 ALLEN SALESMAN
30 ALLEN SALESMAN
<snip>
后,您的代码应按指定的位置重复请求。在您提供的响应中,响应中没有指定位置,这很奇怪,但这是另一个问题。
301
可以是 instructed to handle redirects。