【问题标题】:UnknownHostException trying to connect to Cloudant DB via EktorpUnknownHostException 试图通过 Ektorp 连接到 Cloudant DB
【发布时间】:2014-09-05 02:46:04
【问题描述】:

这不是点击应该如何使用Ektorp 连接到托管的 Cloudant 数据库。我通过新的m2eclipse Maven 集成在 Eclipse 中使用 Ektorp 1.1(这非常棒)。除了 javadocs 之外,我正在努力寻找好的 CouchDB/Cloudant/Ektorp 文档。

我正在尝试从他们的main page 获取示例 Ektorp API 示例来工作:

HttpClient httpClient = new StdHttpClient.Builder()
                                    .host("localhost")
                                    .port(5984)
                                    .build();

CouchDbInstance dbInstance = new StdCouchDbInstance(httpClient);
CouchDbConnector db = new StdCouchDbConnector("mydatabase", dbInstance);

db.createDatabaseIfNotExists();

我用什么来构建 httpClient 并不重要,我总是得到下面的 UnknownHostException 错误。我已经为主机尝试了这些 URL:https/http://cloudant.com/db/_session 和 https/http://[username].cloudant.com

端口号呢?用户名和密码是否应该包含在 StdHttpClient.Builder() 中?

这是完整的错误 - createDatabaseIfNotExists() 调用失败,但我不确定 CouchDbConnector 变量是否正确。

Exception in thread "main" org.ektorp.DbAccessException: java.net.UnknownHostException: https://cloudant.com/db/_session
    at org.ektorp.util.Exceptions.propagate(Exceptions.java:19)
    at org.ektorp.http.StdHttpClient.executeRequest(StdHttpClient.java:104)
    at org.ektorp.http.StdHttpClient.get(StdHttpClient.java:42)
    at org.ektorp.http.RestTemplate.get(RestTemplate.java:21)
    at org.ektorp.impl.StdCouchDbInstance.getAllDatabases(StdCouchDbInstance.java:61)
    at org.ektorp.impl.StdCouchDbConnector.createDatabaseIfNotExists(StdCouchDbConnector.java:256)
    at com.codegouge.examples.App.main(App.java:30)
Caused by: java.net.UnknownHostException: https://cloudant.com/db/_session
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$1.lookupAllHostAddr(InetAddress.java:850)
    at java.net.InetAddress.getAddressFromNameService(InetAddress.java:1201)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1154)
    at java.net.InetAddress.getAllByName(InetAddress.java:1084)
    at java.net.InetAddress.getAllByName(InetAddress.java:1020)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:126)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
    at org.ektorp.http.StdHttpClient.executeRequest(StdHttpClient.java:96)

【问题讨论】:

    标签: java couchdb cloudant


    【解决方案1】:

    所以我做错了几件事。使用 SSL requires additional parameters。另外,Ektorp 1.1.1 includes SSL-related bug fixes 到 1.1.0。所以这是我最终的 HttpClient 构造函数:

    HttpClient httpClient = new StdHttpClient.Builder()
            .host("[username].cloudant.com")
            .port(443)
            .username("[username]")
            .password("[password]")
            .enableSSL(true)
            .relaxedSSLSettings(true)
            .build();
    

    另外,请务必在 pom.xml 中更新 ektorp 的依赖项以查找版本“1.1.1”。如果有兴趣,我有一篇关于此练习的博文here

    【讨论】:

    【解决方案2】:

    您也可以使用该 URL 与 Ektorp 连接:

    JSONObject serviceAttr = val.getJSONObject(0);
                            JSONObject credentials = serviceAttr.getJSONObject("credentials");
                            httpClient = new StdHttpClient.Builder()
                            .url(credentials.getString("url"))
                            .build();
    

    这是一种简单的连接方式。我找到了使用 Ektorp 1.4.2 进行连接的教程: http://www.ibm.com/developerworks/java/library/j-hangman-app/index.html

    【讨论】:

      【解决方案3】:

      我对 Ektorp 不是很熟悉,但您肯定需要在其中获取您的用户名/密码。我建议使用以下代码创建 HttpClient:

      HttpClient httpClient = new StdHttpClient.Builder()
                                          .host("[username].cloudant.com")
                                          .port(443)
                                          .username("[username]")
                                          .password("[password]")
                                          .build();
      

      我已将端口更改为 443(Cloudant 侦听的 HTTPS 的默认端口),并添加了用户名和密码。我看不出有任何方法可以让 Ektorp 知道您想使用 HTTPS,但幸运的是,这将在内部处理。

      【讨论】:

      • 谢谢马特。从主机中删除“http/s”使我能够通过端口 5984 连接并成功执行 createDatabaseIfNotExists() 调用。但是,使用端口 443 会引发 java.net.SocketException。我不得不想象 Ektorp 可以处理 HTTPS。我会继续寻找。干杯!
      • 所以我意识到在构建我的 HttpClient 时我需要包含“.enableSSL(true)”和“.relaxedSSLSettings(true)”,但我现在遇到了 IllegalStateException。
      • @Ryan 好吧,至少进步了。 :) 是的,这些看起来像是正确的调用方法。 Ektorp 站点仍然指向 1.0.2 javadoc,所以我没有注意到它们(SSL 支持在 1.1 中似乎是新的)。如果您能够更新您的问题以包含可能有用的异常堆栈跟踪。
      • Matt,你说得对,ssl 是 1.1 的新手。在发布另一个堆栈跟踪之前,让我做更多调查。
      • @Matt 我切换到 Ektorp 1.1.1,现在一切正常。显然,此版本包括几个 SSL 错误修复。如果人们不阅读 cmets,我会发布答案。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 2020-04-08
      • 1970-01-01
      • 2017-05-06
      • 2016-08-13
      • 1970-01-01
      • 2016-11-25
      • 2018-02-19
      • 1970-01-01
      相关资源
      最近更新 更多