【问题标题】:How to make a GET request to Cloudant from Erlang over HTTPS如何通过 HTTPS 从 Erlang 向 Cloudant 发出 GET 请求
【发布时间】:2011-08-22 08:07:42
【问题描述】:

一段时间以来,我一直在努力解决这个问题……我可以在本地计算机上获取并发布到 couchdb,但现在我想切换到使用需要通过 https 进行连接的 Cloudant。

我想了解发生了什么,所以我更愿意暂时使用 httpc 或类似的东西,而不是说,couchbeam 但我似乎无法深入了解有关通过 SSL 连接的 Erlang 文档,并且任何示例都过于简单HTTP ... Cloudant 似乎也没有任何特定于 Erlang 的文档。

我查看了主题 How do I do an HTTPS request with Erlang,但给出的示例对我不起作用 - 我收到以下错误报告:


ฐ=ERROR REPORT==== 10-May-2011::10:40:26 ===
** Generic server <0.60.0> terminating 
** Last message in was {connect_and_send,
                           {request,#Ref<0.0.0.50>,<0.31.0>,0,https,
                               {"playground.cloudant.com",443},
                               "/",[],get,
                               {http_request_h,undefined,"keep-alive",
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,
                                   "playground.cloudant.com",undefined,
                                   undefined,undefined,undefined,undefined,
                                   undefined,undefined,undefined,undefined,[],
                                   undefined,undefined,undefined,undefined,
                                   "0",undefined,undefined,undefined,
                                   undefined,undefined,undefined,[]},
                               {[],[]},
                               {http_options,"HTTP/1.1",infinity,true,
                                   {ossl,[{verify,0}]},
                                   undefined,false,infinity,false},
                               "https://playground.cloudant.com",[],none,[],
                               1305020425911,undefined,undefined}}
** When Server state == {state,undefined,undefined,undefined,undefined,
                            undefined,undefined,
                            {[],[]},
                            {[],[]},
                            undefined,[],nolimit,nolimit,
                            {options,
                                {undefined,[]},
                                0,2,5,120000,2,disabled,false,inet,default,
                                default,[]},
                            {timers,[],undefined},
                            httpc_manager,undefined}
** Reason for termination == 
** {{badmatch,{error,no_ssl_server}},
    [{ssl,old_connect,4},
     {httpc_handler,connect_and_send_first_request,3},
     {httpc_handler,handle_call,3},
     {gen_server,handle_msg,5},
     {proc_lib,init_p_do_apply,3}]}

然后 Erlang shell 挂起 ...

这是我在 Erlang shell 中输入的代码:


Running Erlang

Eshell V5.8.3  (abort with ^G)

1> inets:start().

ok

2> ssl:start().

ok

3>  httpc:request(head, {"https://playground.cloudant.com", []}, [{ssl,[{verify,0}]}], []).

对于第 3 行,我还尝试了以下方法:

3> httpc:request(head, {"https://playground.cloudant.com", []}, [], []).

3> httpc:request(get, {"https://playground.cloudant.com", []}, [{ssl,[{verify,0}]}], [])。

3> httpc:request(get, {"https://playground.cloudant.com", []}, [], []).

我可以从浏览器连接到https://playground.cloudant.com 没问题。

我显然在这里遗漏了一些东西,但我一生都无法弄清楚是什么。我需要用 SSL 做些什么吗?我应该把任何配置文件放在一个特定的地方吗?任何帮助将不胜感激!

【问题讨论】:

标签: https erlang couchdb cloudant


【解决方案1】:

试试这个:

1> ssl:start().
ok
2> whereis(ssl_sup).
<0.42.0>
3> supervisor:start_child(ssl_sup, {ssl_server, {ssl_server, start_link, []}, permanent, 2000, worker, [ssl_server]}).
{ok,<0.48.0>}
4> whereis(ssl_server).
<0.48.0>

它可能会为您提供更多信息。您的序列开箱即用。

【讨论】:

  • hmmm ...我的设置显然有问题,因为当我运行上述命令时,Erlang shell 中发生了以下情况: 1> ssl:start().好的 2> whereis(ssl_sup)。 3> supervisor:start_child(ssl_sup, {ssl_server, {ssl_server, start_link, []}, 永久, 2000, worker, [ssl_server]})。 {error,{normal,{child,undefined,ssl_server, {ssl_server,start_link,[]}, Permanent,2000,worker, [ssl_server]}}} 4>
  • 然后你可以尝试启动Erlang为erl -ssl edebug true,它会显示一些调试信息。
【解决方案2】:

想更新这个有一段时间了。似乎我的 CA 证书可能不正确,因为在使用 curl 更新 CA 证书包并更新到 Erlang R15B1 之后,上面的示例开始为我工作。所以这似乎是一个设置问题。

请注意,这是一个通过 HTTPS 从 Cloudant 实例获取所有数据库的 httpc 请求:

httpc:request
    (get, 
    {"https://" ++ username() ++ ":" ++ password() ++ "@" ++ username() ++ ".cloudant.com/_all_dbs", []}, 
    [{ssl,[{verify,0}]}], 
    []).

其中的函数 username() 和 password() 分别返回您的 Cloudant 用户名和密码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 2023-03-20
    相关资源
    最近更新 更多