Pros and Cons of Clojure http client libraries

clojure, http, java

Solution

I can only compare http-kit and clj-http.

clj-http:

- simple API

- HTTP client only

- a wrapper for Apache HttpComponents

http-kit:

- designed for async

- HTTP client and server, more powerful

- client API modeled after clj-http but it adds more abstractions so the cognitive load is higher

If you care about dependencies, http-kit may be a better choice because it is a standalone library with no other dependencies than clojure.core. Because of that it produces smaller uberjars. For a sample HTTP GET project:

clj-http:

1.2M    clj-http-test-0.1.0-SNAPSHOT.jar
6.7M    clj-http-test-0.1.0-SNAPSHOT-standalone.jar

http-kit:

65K     http-kit-test-0.1.0-SNAPSHOT.jar
3.8M    http-kit-test-0.1.0-SNAPSHOT-standalone.jar

On the other hand you may choose clj-http if you prefer to trust the battle tested Apache HttpComponents and potentially better support from bigger Java community.

Problem

I am trying to write a http file downloader in Clojure, and in one of my other questions, someone commented that using a dedicated http client library is better than coding with Clojure's and Java's own api. I did some research and found some, but I couldn't figure out features, pros and cons of each. So if some one can explain how they are different and which one is a good match to my project, that would be much appreciated. :-D Libraries originally in Java, and corresponding Clojure wrappers: Apache HttpClient and its Clojure wrapper clj-http Apache HttpAsyncClient and couldn't find any Clojure wrapper. Netty and Clojure "wrapper" is Aleph, I guess? Async Http Client and its Clojure wrapper http.async.client Last but not least, a Clojure library: http-kit

Original source