我正在使用 Erlang 的 httpc 发出带有参数和基本身份验证标头的 get 请求。当在 httpc/1 中没有标头的情况下使用时,如下所示:
url = String.to_char_list("https://endpoint.com/endpoint?param=foo")
:httpc.request(url)
Run Code Online (Sandbox Code Playgroud)
我收到预期的 403 未经授权。但是,当我像这样使用 httpc/4 时:
url = String.to_char_list("https://endpoint.com/endpoint?param=foo")
headers = headers ++ [authheader]
httpc.request(:get, {url, headers}, [], [])
Run Code Online (Sandbox Code Playgroud)
我收到 404 未找到错误。当从浏览器手动添加 auth 标头时,我可以 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'}, ...}
Run Code Online (Sandbox Code Playgroud)
在检查 url 之前执行身份验证,因此您可以尝试连接到不存在的 url 并收到 401:
:httpc.request(:get, {'http://localhost:8080/asdf', []}, [], [])
{:ok, {{'HTTP/1.0', 401, 'Unauthorized'}, ...}
Run Code Online (Sandbox Code Playgroud)
如果添加正确的标题:
:httpc.request(:get, {'http://localhost:8080/asdf', [{'Authorization', 'Basic ' ++ :base64.encode_to_string('test:test')}]}, [], [])
{:ok, {{'HTTP/1.0', 404, 'File not found'}, ...}
Run Code Online (Sandbox Code Playgroud)
另外,这对于 ssl 来说不是问题,因为它会给出完全不同的错误。
服务器对 http 和 https 具有不同路由的可能性也很小。这样,无需将 url 粘贴到浏览器就https://可以工作。
在你的问题中,你说“403未经授权”,而未经授权是401。403是禁止的,但禁止在这种情况下没有多大意义,所以我认为,你的意思是401。
您的问题之前没有冒号httpc.request(...),这使得简单的拼写错误更有可能。
旁白提示:您可以使用'text'(在单引号中)代替String.to_character_list("text").