2011-04-23 36 views
1

这不是一个点击应如何连接到使用Ektorp托管Cloudant数据库连接到Cloudant DB。我在Eclipse中通过新的Maven m2eclipse集成(这是非常甜)使用EKTORP 1.1。我正在努力寻找除javadoc之外的良好CouchDB/Cloudant/Ektorp文档。的UnknownHostException尝试通过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:// [用户名] .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) 

回答

0

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

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

我已经改变了端口443(默认的HTTPS,这Cloudant侦听),我已经添加了一个用户名和密码。我看不出有什么办法让Ektorp知道你想使用HTTPS,但运气好的话可以在内部处理。

+0

感谢马特。从主机中删除“http/s”使我能够通过端口5984连接并成功执行createDatabaseIfNotExists()调用。但是,使用端口443抛出java.net.SocketException。我必须想象Ektorp可以处理HTTPS。我会继续寻找。干杯! – Ryan 2011-04-23 15:35:03

+0

所以我意识到我需要在构建我的HttpClient时包含“.enableSSL(true)”和“.relaxedSSLSettings(true)”,但现在我得到一个IllegalStateException。 – Ryan 2011-04-23 16:18:56

+0

@Ryan好吧,至少进展。 :)是的,那些看起来像正确的方法来调用。 Ektorp站点仍然指向1.0.2 javadoc,所以我没有注意到它们(SSL支持在1.1中似乎是新的)。如果您能够更新您的问题以包含可能有用的异常堆栈跟踪。 – 2011-04-23 17:46:36

3

所以我做错了几件事情。使用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(); 

此外,一定要更新EKTORP在pom.xml的依赖,寻找版本“1.1.1”。如果有兴趣,我有一个博客文章涵盖此练习here

+0

这似乎不起作用了,你介意快速浏览一下:https://groups.google.com/d/topic/ektorp-discuss/wWtChJMx9zs/discussion – pulkitsinghal 2012-10-04 06:19:23

+0

这是工作解决方案,答案以上不适用于我,我确信为什么答案被接受。谢谢,瑞恩! – dongshengcn 2013-01-04 15:12:44

1

您还可以使用URL与EKTORP连接:

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

这是连接简便的方法。我发现了一个教程使用爱克托1.4.2连接: http://www.ibm.com/developerworks/java/library/j-hangman-app/index.html