我正在使用 Erlang 的 httpc 来发出带有参数和基本身份验证 header 的 get 请求。在 httpc/1 中不带 header 使用时,如下所示:

 url = String.to_char_list("https://endpoint.com/endpoint?param=foo")
 :httpc.request(url)

我得到了预期的 403 未授权。但是,当我像这样使用 httpc/4 时:
 url = String.to_char_list("https://endpoint.com/endpoint?param=foo")
 headers = headers ++ [authheader]
 httpc.request(:get, {url, headers}, [], [])

我收到 404 not found 错误。从浏览器手动添加auth header 时,我可以IO.puts url并直接成功访问资源。我的帖子路由在 httpc/4 上都可以正常工作。这里发生了什么事?

最佳答案

这很可能是 URL 中的拼写错误。这就是我在 httpc 中使用基本身份验证的方式。

:httpc.request(:get, {'http://localhost:8080/', [{'Authorization', 'Basic ' ++ :base64.encode_to_string('test:test')}]}, [], [])
{:ok, {{'HTTP/1.0', 200, 'OK'}, ...}

在检查 url 之前执行身份验证,因此您可以尝试连接到不存在的 url 并收到 401:
:httpc.request(:get, {'http://localhost:8080/asdf', []}, [], [])
{:ok, {{'HTTP/1.0', 401, 'Unauthorized'}, ...}

如果添加适当的标题:
:httpc.request(:get, {'http://localhost:8080/asdf', [{'Authorization', 'Basic ' ++ :base64.encode_to_string('test:test')}]}, [], [])
{:ok, {{'HTTP/1.0', 404, 'File not found'}, ...}

此外,这不会是 ssl 的问题,因为它给出了完全不同的错误。

服务器对 http 和 https 有不同的路由的可能性也很小。通过这种方式将 url 粘贴到浏览器而不使用 https:// 可以工作。

在您的问题中,您说“403 未授权”,而未授权是 401。403 是被禁止的,但在这种情况下,禁止没有多大意义,所以我假设,您的意思是 401。

在您的问题中 httpc.request(...) 之前没有冒号,这使得简单的拼写错误更有可能发生。

旁白提示:您可以使用 'text' (在单引号中)而不是 String.to_character_list("text")

关于erlang - 包含身份验证 header 时,http get 请求失败并显示 404,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31319410/

10-14 15:01