Open rkirchofer opened 2 years ago
Hi,
I think the problem comes from here:
:interceptors (concat martian/default-interceptors ...
The default interceptors in martian.core
do not include the "implementation" interceptors that actually make the http request. These you will find in martian.clj-http/default-interceptors
, or any of the other implementation namespaces (not sure which you are using).
Note that your interceptors will run after the martian interceptors, which include setting and validating the headers schema, so if you set the header schema but only populate the extra data after that interceptor as run then you will get the error above.
Hope this helps
Thanks, that's a huge help!
I'm using martian.clj-http
now and I reordered the interceptors. I thought that you were suggesting that I needed to reorder them so that it it will assoc the api key before the martian default interceptors run but it's still failing schema validation.
(defn my-service
[{:keys [base-url api-key http-timeout]
:or {http-timeout 30000}}]
(martian-http/bootstrap
base-url
[{:route-name :get-item
:produces ["application/json"]
:consumes ["application/json"]
:headers-schema {:x-api-key sch/Str}
:path-parts ["/api/" :id]
:path-schema {:id sch/Str}
:method :get}]
{:interceptors (concat [{:name ::add-api-key
:enter (fn [ctx]
(update-in ctx [:request :headers]
assoc :x-api-key api-key))}]
martian-http/default-interceptors)}))
(let [base-url "https://www.my-service.com"
api-key "mochi"]
(fake/with-fake-routes-in-isolation
{"https://www.my-service.com/api/123"
{:get (fn [req]
{:status 200
:body (cheshire.core/generate-string {:a "b"})})}}
(martian/response-for (my-service {:base-url base-url
:api-key api-key})
:get-item
{:id "123"})))
;; Could not coerce value to schema: {:x-api-key missing-required-key}
;; {:type :schema-tools.coerce/error,
;; :schema {:x-api-key java.lang.String},
;; :value {:id "123"},
;; :error {:x-api-key missing-required-key}}
I only added :headers-schema
because I thought that's why it wasn't working. I could just remove it but I'm interested to learn what I'm doing wrong.
Thanks so much for the help!
Hi,
Yes I was suggesting you reorder them as you have done, I expected that to work. It's possible Martian's headers interceptor is not merging properly. It's interesting that the value it sees is the map with your id. This means of course that you could pass the API key in the arguments map to martian, but you probably don't want to arrange your prod code that way.
I'll try to find time to look into this.
I'm struggling to get
response-for
to work when I have an interceptor that adds some headers.I also tried adding
:headers-schema {:x-api-key sch/Str}
but it just saysCould not coerce value to schema: {:x-api-key missing-required-key}
and:headers-schema {(sch/optional-key :x-api-key) sch/Str}
doesn't change anything.