This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2023-01-08
Channels
- # babashka (1)
- # babashka-sci-dev (27)
- # beginners (13)
- # cljdoc (1)
- # clojure (24)
- # clojure-austin (1)
- # clojurescript (76)
- # data-science (18)
- # datomic (7)
- # java (2)
- # malli (7)
- # nbb (7)
- # off-topic (34)
- # portal (1)
- # reagent (9)
- # reitit (4)
- # releases (2)
- # remote-jobs (1)
- # shadow-cljs (11)
- # squint (7)
- # tools-build (7)
- # uncomplicate (1)
would a default interceptor in http-client to make a request send json when a header Content-Type: application/json
is present be useful? it would then treat the body as json: if a map or a vec is passed, it would json/generate-string on it. so that the user doesnt have to do it when making the body.
i sometimes forget the json/generate-string on the body and it fails the ->body-publisher
cond
or maybe even a new opt :as :json
which does both header adding and body coercion?
@rahul080327 You can make an :as :json
interceptor like this:
https://github.com/babashka/http-client#interceptors
Perhaps it should be built-in, but you can do that in user space right now
yeah just saw it after i sent it 😅 im fine with the usage now, if you think its useful as built-in, happy to PR
the example talks about accepting json, i was more on sending json as well. could that be built in as well?
yep, i meant would you consider it built in? i can use it totally fine as of now too with user code 🙂
the thing is, that you can only express so much with :as :json
: request, response, body, keywordize-keys?
yeah hence i was thinking more on the presence of the content-type header
I'll keep it in the back of my mind, and it's worth looking at what clj-http and hato are doing here as well
so this is just for sending the request: if user sets the content-type to application/json, we check if the body can be json encoded, and then encode it
as for the response, yeah we do have a limitation of expression like you said
the thing is, I'd like to keep http-client dependency free and if you start doing things like this, you have to check what kind of json dependencies are available. it's not a problem per se, but I'd like to avoid it if possible
yeah good point
can you at least check what clj-http and hato are doing? I have to get going, I'll read when I come back
on it, thanks!
for clj-http:
;; Send form params as a json encoded body (POST or PUT)
(client/post "" {:form-params {:foo "bar"} :content-type :json})
;; Send form params as a json encoded body (POST or PUT) with options
(client/post "" {:form-params {:foo "bar"}
:content-type :json
:json-opts {:date-format "yyyy-MM-dd"}})
;; Send form params as a Transit encoded JSON body (POST or PUT) with options
(client/post "" {:form-params {:foo "bar"}
:content-type :transit+json
:transit-opts
{:encode {:handlers {}}
:decode {:handlers {}}}})
;; Send form params as a Transit encoded MessagePack body (POST or PUT) with options
(client/post "" {:form-params {:foo "bar"}
:content-type :transit+msgpack
:transit-opts
{:encode {:handlers {}}
:decode {:handlers {}}}})
Output coercion with :as :json, :as :json-string-keys or :as :x-www-form-urlencoded, will only work with an optional dependency
clj-http currently has four optional dependencies, cheshire, crouton, tools.reader and ring/ring-codec
Hato seems to only do output coercion:
Coerce response body with certain format: :json, :json-string-keys, :clojure, :transit+json, :transit+msgpack. JSON and transit coercion require optional dependencies cheshire (5.9.0 or later) and com.cognitect/transit-clj to be installed, respectively.
; Coerces transit. Requires optional dependency com.cognitect/transit-clj.
(hc/get "" {:as :transit+json})
(hc/get "" {:as :transit+msgpack})
; Coerces JSON strings into clojure data structure
; Requires optional dependency cheshire
(hc/get "" {:as :json})
(hc/get "" {:as :json-string-keys})
yeah the more i read it, i see the simplicity of not including json/something else dependency. would be fine to do it in user space. one fine day the jvm adds two things: unix sockets http and json handling. 🤞:skin-tone-5:
@rahul080327 agreed :) I made a #C04J0N76E2G channel now