我正在使用 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/