Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang Elixir-https URL的问题_Erlang_Elixir_Inets - Fatal编程技术网

Erlang Elixir-https URL的问题

Erlang Elixir-https URL的问题,erlang,elixir,inets,Erlang,Elixir,Inets,我不熟悉Elixir和Erlang,在访问https URL时遇到了一些问题。我已经尝试了Elixir特有的HTTPotion和Erlang的:inets模块 因此,从iex控制台(交互式长生不老药): 使用HTTPotion: HTTPotion.start HTTPotion.get("https://api.github.com") 使用:iNet: :inets.start :ssl.start :httpc.request('https://api.github.com') 在这两

我不熟悉Elixir和Erlang,在访问https URL时遇到了一些问题。我已经尝试了Elixir特有的HTTPotion和Erlang的:inets模块

因此,从iex控制台(交互式长生不老药):

使用HTTPotion:

HTTPotion.start
HTTPotion.get("https://api.github.com")
使用:iNet:

:inets.start
:ssl.start
:httpc.request('https://api.github.com')
在这两种情况下,我都会得到一个巨大的stacktrace,essential表示某个地方存在不匹配,状态机正在终止。当访问http URL时,我不明白这一点。我错过了什么?谢谢

编辑-以下是来自HTTPotion的错误消息:

iex(40)> HTTPotion.get("https://api.github.com") 
** (Protocol.UndefinedError) protocol String.Chars not implemented for {:EXIT, {{{{:badmatch, ""}, [{:ssl_handshake, :dec_hello_extensions, 2, [file: 'ssl_handshake.erl', line: 1737]}, {:ssl_handshake, :decode_handshake, 3, [file: 'ssl_handshake.erl', line: 926]}, {:tls_handshake, :get_tls_handshake_aux, 3, [file: 'tls_handshake.erl', line: 155]}, {:tls_connection, :next_state, 4, [file: 'tls_connection.erl', line: 433]}, {:gen_fsm, :handle_msg, 7, [file: 'gen_fsm.erl', line: 503]}, {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 237]}]}, {:gen_fsm, :sync_send_all_state_event, [#PID<0.227.0>, {:start, 5000}, :infinity]}}, {:gen_server, :call, [#PID<0.226.0>, {:send_req, {{:url, 'https://api.github.com', 'api.github.com', 443, :undefined, :undefined, '/', :https, :hostname}, [], :get, "", [], 5000}}, 5000]}}}
       (elixir) lib/string/chars.ex:3: String.Chars.impl_for!/1
       (elixir) lib/string/chars.ex:17: String.Chars.to_string/1
    (httpotion) lib/httpotion.ex:157: HTTPotion.request/5
iex(40)> 
16:50:10.640 [error] ** State machine #PID<0.227.0> terminating 
** Last message in was {:tcp, #Port<0.7454>,
 <<22, 3, 3, 0, 93, 2, 0, 0, 89, 3, 3, 84, 40, 158, 178, 2, 216, 45, 226, 183, 79, 42, 199, 205, 19, 31, 63, 223, 138, 208, 132, 186, 28, 129, 123, 235, 1, 142, 90, 243, 25, 70, 210, 32, 199, 56, 251, 131, ...>>}
** When State == :hello
**      Data  == [data: [{'StateData',
   {:state, :client, {#Reference<0.0.0.1360>, #PID<0.226.0>}, :gen_tcp,
    :tls_connection, :tcp, :tcp_closed, :tcp_error, 'api.github.com', 443,
    #Port<0.7454>,
    {:ssl_options, :tls, [{3, 3}, {3, 2}, {3, 1}, {3, 0}], :verify_none,
     {#Function<7.50551058/3 in :ssl.handle_verify_options/2>, []},
     #Function<8.50551058/1 in :ssl.handle_verify_options/2>, false, false,
     :undefined, 1, "", '***', "", '***', '***', '***', "", '***', :undefined,
     :undefined, '***', '***',
     [<<192, 36>>, <<192, 40>>, <<192, 38>>, <<192, 42>>, <<0, 107>>,
      <<0, 106>>, <<0, 61>>, <<192, 35>>, <<192, 39>>, <<192, 37>>, <<192, 41>>, 
      <<0, 103>>, <<0, ...>>, <<...>>, ...],
     #Function<1.50551058/4 in :ssl.handle_options/1>, true, 268435456, false,
     :undefined, false, :undefined, :undefined, true, :undefined, false},
    {:socket_options, :binary, 0, 0, 0, false}, '***', '***', '***', 49168,
    '***', 61463, :ssl_session_cache, {3, 3}, false, :undefined,
    {:undefined, :undefined}, :undefined, :undefined, '***', '***', '***',
    :undefined, '***', '***', '***', 53269, #Reference<0.0.0.1363>, :undefined,
    '***', {false, :first}, {#PID<0.226.0>, #Reference<0.0.0.1361>},
    #Reference<0.0.0.1364>, {[], []}, false, true, false, false, :undefined,
    :undefined, :undefined}}]]
** Reason for termination = 
** {{:badmatch, ""},
 [{:ssl_handshake, :dec_hello_extensions, 2,
   [file: 'ssl_handshake.erl', line: 1737]},
  {:ssl_handshake, :decode_handshake, 3,
   [file: 'ssl_handshake.erl', line: 926]},
  {:tls_handshake, :get_tls_handshake_aux, 3,
   [file: 'tls_handshake.erl', line: 155]},
  {:tls_connection, :next_state, 4, [file: 'tls_connection.erl', line: 433]},
  {:gen_fsm, :handle_msg, 7, [file: 'gen_fsm.erl', line: 503]},
  {:proc_lib, :init_p_do_apply, 3, [file: 'proc_lib.erl', line: 237]}]}


16:50:10.642 [error] GenServer #PID<0.226.0> terminating
Last message: {:send_req, {{:url, 'https://api.github.com', 'api.github.com', 443, :undefined, :undefined, '/', :https, :hostname}, [], :get, "", [], 5000}}
State: {:state, 'api.github.com', 443, :undefined, #Reference<0.0.0.1352>, false, :undefined, [], true, :undefined, false, [], {[], []}, :undefined, :idle, :undefined, "", 0, 0, [], :undefined, :undefined, :undefined, :undefined, false, :undefined, :undefined, "", :undefined, false, 188446, 0, :undefined}
** (exit) exited in: :gen_fsm.sync_send_all_state_event(#PID<0.227.0>, {:start, 5000}, :infinity)
    ** (EXIT) an exception was raised:
        ** (MatchError) no match of right hand side value: ""
            (ssl) ssl_handshake.erl:1737: :ssl_handshake.dec_hello_extensions/2
            (ssl) ssl_handshake.erl:926: :ssl_handshake.decode_handshake/3
            (ssl) tls_handshake.erl:155: :tls_handshake.get_tls_handshake_aux/3
            (ssl) tls_connection.erl:433: :tls_connection.next_state/4
            (stdlib) gen_fsm.erl:503: :gen_fsm.handle_msg/7
            (stdlib) proc_lib.erl:237: :proc_lib.init_p_do_apply/3

nil
iex(41)> 
iex(40)>HTTPotion.get(“https://api.github.com") 
**(Protocol.UndefinedError)Protocol String.Chars未为{:EXIT,{{{{:badmatch,“},[{:ssl_handshake,:dec_hello_extensions,2,[file:'ssl_handshake.erl',line:1737]},{:ssl_handshake,:decode_handshake_,3,[file:'ssl_handshake_.erl',line:926]},{:tls_handshake,:get_handshake_handshake_aux,3文件:'tls_,line:155; handshake},{:tls_connection,:next_state,4,[文件:'tls_connection.erl',行:433]},{:gen_fsm,:handle_msg,7,[文件:'gen_fsm.erl',行:503]},{:proc_-lib,:init p_-do_-apply,3,[文件:'proc_-lib.erl',行:237]},{:gen gen fsm,:sync_-send_-all_-state事件,[\35; PID,:start,5000,},{:PID,},{:send服务器,},{:gen{{:url,'https://api.github.com“,'api.github.com',443,:未定义,:未定义,'/”,:https,:hostname},[],:get,“,[],[],]5000},5000]}
(elixir)lib/string/chars.ex:3:string.chars.impl_for!/1
(elixir)lib/string/chars.ex:17:string.chars.to_string/1
(httpotion)lib/httpotion.ex:157:httpotion.request/5
iex(40)>
16:50:10.640[错误]**状态机#PID终止
**最后一条消息是{:tcp,#端口,
}
**当State==:hello
**数据==[数据:[{'StateData',
{:state,:client,{#Reference,#PID},:gen#u tcp,
:tls_连接,:tcp,:tcp_关闭,:tcp_错误,'api.github.com',443,
#港口,
{:ssl_选项,:tls,[{3,3},{3,2},{3,1},{3,0}],:verify_none,
{#函数,[]},
#函数,假,假,
:未定义,1,“,”***',“,”,“***',“***',”***',“***',”,“***',”:未定义,
:未定义“***”和“***”,
[, , ,
, , , 
, , ...],
#函数,真,268435456,假,
:undefined,false,:undefined,:undefined,true,:undefined,false},
{:socket_选项,:二进制,0,0,0,false},'***','***','***','***',49168,
“***”,61463,:ssl_会话_缓存,{3,3},false,:未定义,
{:未定义,:未定义},:未定义,:未定义,'***','***','***',
:未定义,'***','***','***',53269,#参考,:未定义,
“***”,{false,:first},{PID,#Reference},
#引用,{[],[]},false,true,false,false,:未定义,
:未定义,:未定义}]]
**终止原因=
**{{:不匹配,“},
[{:ssl\u握手,:dec\u hello\u扩展,2,
[文件:'ssl_handshake.erl',行:1737]},
{:ssl_握手,:解码_握手,3,
[文件:'ssl_handshake.erl',行:926]},
{:tls_握手,:get_tls_握手,3,
[文件:“tls_handshake.erl”,第155行],
{:tls_connection,:next_state,4,[文件:'tls_connection.erl',行:433]},
{:gen_fsm,:handle_msg,7,[文件:'gen_fsm.erl',行:503]},
{:proc_lib,:init_p_do_apply,3,[文件:'proc_lib.erl',行:237]}
16:50:10.642[错误]发电机服务器#PID终止
最后一条消息:{:发送请求,{{:url,'https://api.github.com“,'api.github.com',443,:未定义,:未定义,'/',:https,:hostname},[],:get,“,[],[],5000}”
状态:{:State,'api.github.com',443,:未定义,#引用,false,:未定义,[],true,:未定义,false,[],{[],[},:未定义,:idle,:未定义,:未定义,:未定义,false,:未定义,:未定义,:未定义,,:未定义,false,188446,0,:未定义}
**(退出)退出::gen_fsm.sync_send_all_state_事件(#PID,{:start,5000},:无穷大)
**(退出)引发了一个异常:
**(MatchError)右侧值不匹配:“”
(ssl)ssl_握手。erl:1737::ssl_握手。dec_hello_扩展/2
(ssl)ssl_握手。erl:926::ssl_握手。解码_握手/3
(ssl)tls_握手。erl:155::tls_握手。获取tls_握手\u辅助/3
(ssl)tls_connection.erl:433::tls_connection.next_state/4
(stdlib)gen_fsm.erl:503::gen_fsm.handle_msg/7
(stdlib)proc_lib.erl:237::proc_lib.init_p_do_apply/3
无
iex(41)>

谜团解决了。我将这个问题发布到Elixir lang组,这是Erlang OTP 17.3中的一个已知错误。解决方法是应用补丁,等待下一个版本,或者降级到OTP 17.1

详情如下:

降级至Erlang 17.1或使用GitHub-

如果您选择使用GitHub中的“OTP-17.3.4”发布标签,那么在下载源代码并解压缩后,在运行常规构建说明(./configure,make,make install)之前,请运行
/OTP\u build autoconf


17.3.4是一个内部版本,因此官方Erlang站点上没有可用的版本。[来源:。尽管如此,我确实看到Erlang Solutions站点有名为17.3 rev2的版本。

如果您可以共享此stacktrace消息,将有很大帮助。您的依赖项中是否有
ibrowse
?发布了来自HTTPotion的错误消息。是的,ibrowse在我的mix.exs文件中({:ibrowse,github:“cmullaparti/ibrowse”,标记:“v4.1.0”)。我用“iex-S mix”启动iex控制台。这似乎是一个简单的ssl错误:{:退出,{{{:badmatch,“}[{:ssl\u handshake,:dec\u hello\u extensions,我可以在浏览器中键入相同的URL并获得有效的JSON响应。为什么使用Elixir或Erlang客户端会引发错误?我调用的函数是否错误?是否需要指定其他信息?鉴于17.1包含通配符的回归。最安全的选择是升级到17.4或17.3.4如以下部分答案所述。