2011-04-23 32 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