4

しばらくの間、これに頭を悩ませていました...ローカルマシンでcouchdbを取得して投稿することはできますが、https経由の接続を必要とするCloudantの使用に切り替えたいと考えています。

私は何が起こっているのかを理解したいので、たとえばカウチビームではなく、当面は httpc などを使用することを好みますが、SSL を介した接続に関する Erlang のドキュメントを理解できないようであり、例はプレーンな HTTP を介しています.. . Cloudant には、Erlang 固有のドキュメントもないようです。

Erlang で HTTPS リクエストを行うにはどうすればよいかというトピックを見てきましたが、与えられた例がうまくいきません - 次のエラー レポートが表示されます。


ฐ=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シェルがハングします...

Erlang シェルに入力しているコードは次のとおりです。


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 に関して何か必要なことはありますか? 特定の場所に配置する必要がある構成ファイルはありますか? どんな助けでも大歓迎です!

4

2 に答える 2

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>

追加情報を提供する場合があります。あなたのシーケンスは、すぐに使用できます。

于 2011-05-10T18:13:48.693 に答える
0

しばらくこれを更新することを意味していました。CA証明書バンドルをcurlで更新し、Erlang R15B1に更新した後、上記の例が機能し始めたため、CA証明書が正しくなかったようです。したがって、これは設定の問題だったようです。

注目すべきは、Cloudant のインスタンスから HTTPS 経由ですべてのデータベースを取得するための httpc 要求です。

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

ここで、関数 username() と password() はそれぞれ Cloudant のユーザー名とパスワードを返します。

于 2012-06-12T10:02:25.823 に答える