我正在使用Erlang的httpc来生成带参数的get请求和一个基本的auth头。在没有httpc / 1中的标题的情况下使用时,如下所示:
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未找到错误。我可以IO.puts url并在从浏览器手动添加auth标头时成功直接访问资源。我的帖子路由所有工作都很好用httpc / 4。这里发生了什么?
答案 0 :(得分:0)
这很可能是网址中的拼写错误。这就是在httpc中使用基本身份验证的方式对我而言。
:httpc.request(:get, {'http://localhost:8080/', [{'Authorization', 'Basic ' ++ :base64.encode_to_string('test:test')}]}, [], [])
{:ok, {{'HTTP/1.0', 200, 'OK'}, ...}
在检查网址之前已经执行了身份验证,因此您可以尝试连接到不存在的网址并接收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路由也很小。这样就可以在不使用https://
的情况下将网址粘贴到浏览器。
在你的问题中,你说“403未经授权”,而未经授权是401. 403被禁止,但禁止在这种情况下没有多大意义,所以我认为,你的意思是401。
问题中httpc.request(...)
之前没有冒号,这更容易造成简单的拼写错误。
除了提示:您可以使用'text'
(单引号)代替String.to_character_list("text")
。