IBM Cloudant Java SDK is a client library that interacts with the IBM Cloudant APIs.
Disclaimer: This library is still a 0.x release. We do consider this library production-ready and capable, but there are still some limitations we’re working to resolve, and refinements we want to deliver. We are working really hard to minimise the disruption from now until the 1.0 release, but there may still be some changes that impact applications using this SDK. For now, be sure to pin versions to avoid surprises.
Table of Contents
The IBM Cloudant Java SDK allows developers to programmatically
interact with IBM Cloudant
with the help of the com.ibm.cloud.cloudant package.
The purpose of this Java SDK is to wrap most of the HTTP request APIs provided by Cloudant and supply other functions to ease the usage of Cloudant. This SDK should make life easier for programmers to do what’s really important to them: developing software.
Reasons why you should consider using Cloudant Java SDK in your project:
- Supported by IBM Cloudant.
- Server compatibility with:
- IBM Cloudant.
- Apache CouchDB 3.x for data operations.
- Includes all the most popular and latest supported endpoints for applications.
- Handles the authentication.
- Familiar user experience with IBM Cloud SDKs.
- Flexibility to use either built-in models or byte-based requests and responses for documents.
- HTTP2 support for higher performance connections to IBM Cloudant.
- Perform requests either synchronously or asynchronously.
- Instances of the client are unconditionally thread-safe.
- Transparently compresses request and response bodies.
The current version of this SDK is: 0.5.4
The project artifacts are published on the Maven Central. This is the default public repository used by Maven when searching for dependencies.
To use Maven Central within your Gradle build add mavenCentral() to the repositories in your build.gradle file:
repositories {
// other repositories...
mavenCentral()
}To use the Cloudant Java SDK, define a dependency that contains the artifact coordinates (group id, artifact id and version) for the service, like this:
Extend Maven dependencies in your pom.xml file with the cloudant library.
<dependencies>
<!--> other dependencies... </-->
<dependency>
<groupId>com.ibm.cloud</groupId>
<artifactId>cloudant</artifactId>
<version>0.5.4</version>
</dependency>
</dependencies>Add the cloudant library to the dependencies in your build.gradle file:
dependencies {
// other dependencies...
implementation group: "com.ibm.cloud", name: "cloudant", version: "0.5.4"
}This library requires some of your Cloudant service credentials to authenticate with your account.
IAM,COUCHDB_SESSION,BASICorNOAUTHauthentication type.- IAM authentication is highly recommended when your
back-end database server is Cloudant. This
authentication type requires a server-generated
apikeyinstead of a user-given password. You can create one here. - Session cookie (
COUCHDB_SESSION) authentication is recommended for Apache CouchDB or for Cloudant when IAM is unavailable. It exchanges username and password credentials for anAuthSessioncookie from the/_sessionendpoint. - Basic (or legacy) authentication is a fallback
for both Cloudant and Apache CouchDB
back-end database servers. This authentication type requires the good old
usernameandpasswordcredentials. - Noauth authentication does not require credentials. Note that this authentication type only works with queries against a database with read access for everyone.
- IAM authentication is highly recommended when your
back-end database server is Cloudant. This
authentication type requires a server-generated
- The service
url.
There are several ways to set these properties:
- As environment variables
- The programmatic approach
- With an external credentials file
For Cloudant IAM authentication, set the following environmental variables by
replacing the <url> and <apikey> with your proper
service credentials. There is no need to set
CLOUDANT_AUTH_TYPE to IAM because it is the default.
CLOUDANT_URL=<url>
CLOUDANT_APIKEY=<apikey>For COUCHDB_SESSION authentication, set the following environmental variables
by replacing the <url>, <username> and <password> with your proper
service credentials.
CLOUDANT_AUTH_TYPE=COUCHDB_SESSION
CLOUDANT_URL=<url>
CLOUDANT_USERNAME=<username>
CLOUDANT_PASSWORD=<password>For Basic authentication, set the following environmental variables by
replacing the <url>, <username> and <password> with your proper
service credentials.
CLOUDANT_AUTH_TYPE=BASIC
CLOUDANT_URL=<url>
CLOUDANT_USERNAME=<username>
CLOUDANT_PASSWORD=<password>Note: There are also additional Bearer token, Container and VPC Instance authentication methods. For more details, please follow the provided links. We recommend that you use IAM for Cloudant and Session for CouchDB authentication.
To use an external configuration file, the Cloudant API docs, or the general SDK usage information will guide you.
To learn more about how to use programmatic authentication, see the related documentation in the Cloudant API docs or in the Java SDK Core document about authentication.
For fundamental SDK usage information and config options, please see the common IBM Cloud SDK documentation.
No request timeout is defined, but a 60s connect, a 2.5m read and a 60s write timeout are set by default. Be sure to set a request timeout appropriate to your application usage and environment. The request timeout section contains details on how to change the value.
Note: System settings may take precedence over configured timeout values.
The following code examples authenticate with the environment variables.
Note: This example code assumes that orders database does not exist in your account.
This example code creates orders database and adds a new document "example"
into it. To connect, you must set your environment variables with
the service url, authentication type and authentication credentials
of your Cloudant service.
Cloudant environment variable naming starts with a service name prefix that identifies your service.
By default, this is CLOUDANT, see the settings in the
authentication with environment variables section.
If you would like to rename your Cloudant service from CLOUDANT,
you must use your defined service name as the prefix for all Cloudant related environment variables.
Once the environment variables are set, you can try out the code examples.
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.Document;
import com.ibm.cloud.cloudant.v1.model.DocumentResult;
import com.ibm.cloud.cloudant.v1.model.Ok;
import com.ibm.cloud.cloudant.v1.model.PostDocumentOptions;
import com.ibm.cloud.cloudant.v1.model.PutDatabaseOptions;
// Uncomment import below if using "putDocument" method
// import com.ibm.cloud.cloudant.v1.model.PutDocumentOptions;
import com.ibm.cloud.sdk.core.service.exception.ServiceResponseException;
public class CreateDbAndDoc {
public static void main(String[] args) {
// 1. Create a client with `CLOUDANT` default service name ============
Cloudant client = Cloudant.newInstance();
// 2. Create a database ===============================================
// Create a database object with "orders" id
String exampleDbName = "orders";
PutDatabaseOptions putDbOptions =
new PutDatabaseOptions.Builder().db(exampleDbName).build();
// Try to create database if it doesn't exist
try {
Ok putDatabaseResult = client
.putDatabase(putDbOptions)
.execute()
.getResult();
if (putDatabaseResult.isOk()) {
System.out.println("\"" + exampleDbName +
"\" database created.");
}
} catch (ServiceResponseException sre) {
if (sre.getStatusCode() == 412)
System.out.println("Cannot create \"" + exampleDbName +
"\" database, it already exists.");
}
// 3. Create a document ===============================================
// Create a document object with "example" id
String exampleDocId = "example";
Document exampleDocument = new Document();
// Setting id for the document is optional when "postDocument" method is used for CREATE.
// When id is not provided the server will generate one for your document.
exampleDocument.setId(exampleDocId);
// Add "name" and "joined" fields to the document
exampleDocument.put("name", "Bob Smith");
exampleDocument.put("joined", "2019-01-24T10:42:59.000Z");
// Save the document in the database with "postDocument" method
PostDocumentOptions createDocumentOptions =
new PostDocumentOptions.Builder()
.db(exampleDbName)
.document(exampleDocument)
.build();
DocumentResult createDocumentResponse = client
.postDocument(createDocumentOptions)
.execute()
.getResult();
// ====================================================================
// Note: saving the document can also be done with the "putDocument"
// method. In this case `docId` is required for a CREATE operation:
/*
PutDocumentOptions createDocumentOptions =
new PutDocumentOptions.Builder()
.db(exampleDbName)
.docId(exampleDocId)
.document(exampleDocument)
.build();
DocumentResult createDocumentResponse = client
.putDocument(createDocumentOptions)
.execute()
.getResult();
*/
// ====================================================================
// Keeping track of the revision number of the document object
// is necessary for further UPDATE/DELETE operations:
exampleDocument.setRev(createDocumentResponse.getRev());
System.out.println("You have created the document:\n" +
exampleDocument);
}
}When you run the code, you see a result similar to the following output.
"orders" database created.
You have created the document:
{
"_id": "example",
"_rev": "1-1b403633540686aa32d013fda9041a5d",
"joined": "2019-01-24T10:42:99.000Z",
"name": "Bob Smith"
}Note: This example code assumes that you have created both the orders
database and the example document by
running the previous example code
successfully. Otherwise, the following error message occurs, "Cannot delete document because either 'orders'
database or 'example' document was not found."
Gather database information example
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.DatabaseInformation;
import com.ibm.cloud.cloudant.v1.model.Document;
import com.ibm.cloud.cloudant.v1.model.GetDatabaseInformationOptions;
import com.ibm.cloud.cloudant.v1.model.GetDocumentOptions;
import com.ibm.cloud.cloudant.v1.model.ServerInformation;
public class GetInfoFromExistingDatabase {
public static void main(String[] args) {
// 1. Create a client with `CLOUDANT` default service name ============
Cloudant client = Cloudant.newInstance();
// 2. Get server information ==========================================
ServerInformation serverInformation = client
.getServerInformation()
.execute()
.getResult();
System.out.println("Server Version: " +
serverInformation.getVersion());
// 3. Get database information for "orders" =========================
String dbName = "orders";
GetDatabaseInformationOptions dbInformationOptions =
new GetDatabaseInformationOptions.Builder(dbName).build();
DatabaseInformation dbInformationResponse = client
.getDatabaseInformation(dbInformationOptions)
.execute()
.getResult();
// 4. Show document count in database =================================
Long documentCount = dbInformationResponse.getDocCount();
System.out.println("Document count in \"" +
dbInformationResponse.getDbName() +
"\" database is " + documentCount +
".");
// 5. Get "example" document out of the database by document id ===========
GetDocumentOptions getDocOptions = new GetDocumentOptions.Builder()
.db(dbName)
.docId("example")
.build();
Document documentExample = client
.getDocument(getDocOptions)
.execute()
.getResult();
System.out.println("Document retrieved from database:\n" +
documentExample);
}
}Server Version: 2.1.1
Document count in "orders" database is 1.
Document retrieved from database:
{
"_id": "example",
"_rev": "1-1b403633540686aa32d013fda9041a5d",
"name": "Bob Smith",
"joined": "2019-01-24T10:42:99.000Z"
}Note: This example code assumes that you have created both the orders
database and the example document by
running the previous example code
successfully. Otherwise, the following error message occurs, "Cannot update document because either 'orders'
database or 'example' document was not found."
Update code example
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.Document;
import com.ibm.cloud.cloudant.v1.model.DocumentResult;
import com.ibm.cloud.cloudant.v1.model.GetDocumentOptions;
import com.ibm.cloud.cloudant.v1.model.PostDocumentOptions;
// Uncomment import below if using "putDocument" method
// import com.ibm.cloud.cloudant.v1.model.PutDocumentOptions;
import com.ibm.cloud.sdk.core.service.exception.NotFoundException;
// Uncomment import below if using response byte stream
// import java.io.InputStream;
public class UpdateDoc {
public static void main(String[] args) {
// 1. Create a client with `CLOUDANT` default service name ============
Cloudant client = Cloudant.newInstance();
// 2. Update the document =============================================
// Set the options to get the document out of the database if it exists
String exampleDbName = "orders";
GetDocumentOptions documentInfoOptions =
new GetDocumentOptions.Builder()
.db(exampleDbName)
.docId("example")
.build();
try {
// Try to get the document if it previously existed in the database
Document document = client
.getDocument(documentInfoOptions)
.execute()
.getResult();
// Note: for response byte stream use:
/*
InputStream documentAsByteStream =
client.getDocumentAsStream(documentInfoOptions)
.execute()
.getResult();
*/
// Add Bob Smith's address to the document
document.put("address", "19 Front Street, Darlington, DL5 1TY");
// Remove the joined property from document object
document.removeProperty("joined");
// Update the document in the database
PostDocumentOptions updateDocumentOptions =
new PostDocumentOptions.Builder()
.db(exampleDbName)
.document(document)
.build();
// ================================================================
// Note: for request byte stream use:
/*
PostDocumentOptions updateDocumentOptions =
new PostDocumentOptions.Builder()
.db(exampleDbName)
.contentType("application/json")
.body(documentAsByteStream)
.build();
*/
// ================================================================
DocumentResult updateDocumentResponse = client
.postDocument(updateDocumentOptions)
.execute()
.getResult();
// ====================================================================
// Note: updating the document can also be done with the "putDocument"
// method. docId and rev are required for an UPDATE operation,
// but rev can be provided in the document object too:
/*
PutDocumentOptions updateDocumentOptions =
new PutDocumentOptions.Builder()
.db(exampleDbName)
.docId(document.getId()) // docId is a required parameter
.rev(document.getRev())
.document(document) // rev in the document object CAN replace above `rev` parameter
.build();
DocumentResult updateDocumentResponse = client
.putDocument(updateDocumentOptions)
.execute()
.getResult();
*/
// ====================================================================
// Keeping track of the latest revision number of the document object
// is necessary for further UPDATE/DELETE operations:
document.setRev(updateDocumentResponse.getRev());
System.out.println("You have updated the document:\n" + document);
} catch (NotFoundException nfe) {
System.out.println("Cannot update document because " +
"either \"orders\" database or the \"example\" " +
"document was not found.");
}
}
}You have updated the document:
{
"_id": "example",
"_rev": "2-4e2178e85cffb32d38ba4e451f6ca376",
"address": "19 Front Street, Darlington, DL5 1TY",
"name": "Bob Smith"
}Note: This example code assumes that you have created both the orders
database and the example document by
running the previous example code
successfully. Otherwise, the following error message occurs, "Cannot delete document because either 'orders'
database or 'example' document was not found."
Delete code example
import com.ibm.cloud.cloudant.v1.Cloudant;
import com.ibm.cloud.cloudant.v1.model.DeleteDocumentOptions;
import com.ibm.cloud.cloudant.v1.model.Document;
import com.ibm.cloud.cloudant.v1.model.DocumentResult;
import com.ibm.cloud.cloudant.v1.model.GetDocumentOptions;
import com.ibm.cloud.sdk.core.service.exception.NotFoundException;
public class DeleteDoc {
public static void main(String[] args) {
// 1. Create a client with `CLOUDANT` default service name ============
Cloudant client = Cloudant.newInstance();
// 2. Delete the document =============================================
// Set the options to get the document out of the database if it exists
String exampleDbName = "orders";
String exampleDocId = "example";
GetDocumentOptions documentInfoOptions =
new GetDocumentOptions.Builder()
.db(exampleDbName)
.docId(exampleDocId)
.build();
try {
// Try to get the document if it previously existed in the database
Document document = client
.getDocument(documentInfoOptions)
.execute()
.getResult();
// Delete the document from the database
DeleteDocumentOptions deleteDocumentOptions =
new DeleteDocumentOptions.Builder()
.db(exampleDbName)
.docId(exampleDocId) // docId is required for DELETE
.rev(document.getRev()) // rev is required for DELETE
.build();
DocumentResult deleteDocumentResponse = client
.deleteDocument(deleteDocumentOptions)
.execute()
.getResult();
if (deleteDocumentResponse.isOk()) {
System.out.println("You have deleted the document.");
}
} catch (NotFoundException nfe) {
System.out.println("Cannot delete document because " +
"either \"orders\" database or the \"example\" " +
"document was not found.");
}
}
}You have deleted the document.For a complete list of code examples, see the examples directory.
For sample code on handling errors, see Cloudant API docs.
For endpoints that read or write document content it is possible to bypass usage of the built-in object with byte streams.
Depending on the specific SDK operation it may be possible to:
- accept a user-provided byte stream to send to the server as a request body
- return a byte stream of the server response body to the user
Request byte stream can be supplied for builder objects that have the body method.
For these cases you can pass this byte stream directly to the HTTP request body.
Response byte stream is supported in functions with the suffix of AsStream.
The returned byte stream allows the response body to be consumed
without triggering JSON unmarshalling that is typically performed by the SDK.
The update document section contains examples for both request and response byte stream cases.
The API reference contains further examples of using byte streams. They are titled "Example request as stream" and are initially collapsed. Expand them to see examples of:
-
Byte requests:
-
Byte responses:
- Cloudant API docs: API reference including usage examples for Cloudant Java SDK API.
- Javadoc: Cloudant Java SDK API Documentation.
- Cloudant docs: The official documentation page for Cloudant.
- Cloudant blog: Many useful articles about how to optimize Cloudant for common problems.
If you are having difficulties using this SDK or have a question about the IBM Cloud services, ask a question on Stack Overflow.
If you encounter an issue with the project, you are welcome to submit a bug report.
Before you submit a bug report, search for similar issues and review the KNOWN_ISSUES file to verify that your issue hasn't been reported yet.
Please consult the security policy before opening security related issues.
Find more open source projects on the IBM GitHub page.
For more information, see CONTRIBUTING.
This SDK is released under the Apache 2.0 license. To read the full text of the license, see LICENSE.
