This API is required by the atmo-client -c which allows C developers to easily connect to an Atmos based Storage cloud, performing the REST requests and responses.
- libcurl 7.20 or greater
Ubuntu:
sudo apt-get install libcurl.x86_64 libcurl4-openssl-dev
CentOS/RHEL:
sudo yum install libcurl-devel.x86_64 libcurl.x86_64
This package uses autotools, so the standard GNU build procedure can be used:
./configure
make
sudo make install
This installation places the librest libraries in the /usr/local/lib directory where atmos-client-c will check for this dependency.
Since this client is based on libcurl, it's imperative that you call
curl_global_init(CURL_GLOBAL_DEFAULT);
Before executing any requests and
curl_global_cleanup();
Before exiting your application. Otherwise, you will cause memory leaks.
To execute requests, you'll first create a RestClient configured for the endpoint (host/port) you want to connect to. From there, you'll execute multiple requests using the client. RestClient objects are thread-safe when the library is compiled with pthread support (default). When using multiple threads, libcurl will maintain a connection pool as long as you're using the same RestClient instance.
Each request is executed using a 'chain' of RestFilter functions. At a minimum, you'll need to include the RestFilter_execute_curl_request
function in your chain to execute the request. The chain is a linked list and handlers are added to the front of the chain. Therefore, you should add RestFilter_execute_curl_request
first so it gets executed last. Requests flow from the first handler to the last, and then back up to the first. This gives each handler a chance to modify the request before it executes and a chance to examine the response before the client application sees it. See the atmos-client-c project for examples of using multiple handlers (near the top of lib/atmos_client.c
).
A bare-bones HTTP request looks like this:
// Load the root of the server.
RestClient c;
RestRequest req;
RestResponse res;
RestFilter* chain = NULL;
RestClient_init(&c, "www.google.com", 80);
RestRequest_init(&req, "/", HTTP_GET);
RestResponse_init(&res);
chain = RestFilter_add(chain, &RestFilter_execute_curl_request);
RestClient_execute_request(&c, chain, &req, &res);
// Process your response here.
RestFilter_free(chain);
RestResponse_destroy(&res);
RestRequest_destroy(&req);
RestClient_destroy(&c);
Note that as stated above, if you're executing multiple requests to the same server you'd only initialize the RestClient once. For more examples, see the tests/ subdirectory and the emcvipr/atmos-client-c project on GitHub.