如何在clojurescript

时间:2019-04-10 21:11:46

标签: api http-headers clojurescript

我正在使用KeeFrame在clojurescript中构建一个演示应用程序,并检索该网站的部分信息,我需要调用一个外部API,该API在GET请求中需要自定义HTTP标头参数

我正在使用re-frame.core进行API调用,该调用使用了ajax.core。 我也尝试用cljs-http.client替换它。但是结果是一样的。 我已经设法通过在服务器站点使用clj-http向请求标头添加自定义标头参数。但这不是我想为此网站实现的解决方案,因为这意味着我首先必须重建正在调用的API。因此,我可以从clojurescript中使用它而无需使用该参数。

此代码有效。生成了正确的GET请求

{:http-xhrio {
 :method          :get
 :uri             (str transuri "/acquirer/" 673072009 "/acquirerref/" acquirerRefNo)
 :headers         {"Accept" "application/json"}
 :response-format (http/json-response-format {:keywords? true})
 :on-failure      [:common/set-error]}}

使用“接受:application / json”作为请求标头

此代码无效。代替GET请求,而是生成OPTIONS请求

{:http-xhrio {
 :method          :get
 :uri             (str transuri "/acquirer/" 673072009 "/acquirerref/" acquirerRefNo)
 :headers         {"Accept" "application/json" "Custom" "Value"}
 :response-format (http/json-response-format {:keywords? true})
 :on-failure      [:common/set-error]}}

在请求标头中,“ Accept:application / json”不可见,但“ Access-Control-Request-Headers:custom”显示

我希望在请求标头中包含“接受:application / json”和“自定义:值”的GET请求。

有人可以告诉我我做错了什么,还是可以提供有关此信息的链接?

预先感谢

2 个答案:

答案 0 :(得分:0)

我还没有使用过KeeFrame,但是有一个使用我正在开发的新re-frame库的工作示例。它使用此拦截器调用ajax请求:

(def ajax-intc
  "Interceptor for performing AJAX requests"
  (interceptor
    {:id    :ajax-intc
     :enter identity
     :leave (fn [ctx] ; #todo (with-result ctx ...)
              (let [ajax (:ajax ctx)]
                ;(t/spyx :ajax-intc-start ctx)
                ;(t/spyx :ajax-intc-start ajax)
                (when-not (nil? ajax)
                  (t/spy :awt-ajax-intc--ajax ajax)
                  (let [method            (t/grab :method ajax)
                        uri               (t/grab :uri ajax)
                        ajax-opts-present (set/intersection (set (keys ajax)) ajax-options-keys)
                        opts-map          (t/submap-by-keys ajax ajax-opts-present)]
                    ;(t/spy :ajax-intc-ready (t/vals->map method uri opts-map))
                    (condp = method
                      :get (do
                             (t/spy :awt-ajax-intc--opts-map opts-map)
                             (ajax/GET uri opts-map))
                      :put (ajax/PUT uri opts-map)
                      :post (ajax/POST uri opts-map)
                      (throw (ex-info "ajax-intc: unrecognized :method" ajax))))))
              ctx)}))

与此事件一起调用时:

  (flame/dispatch-event [:ajax-demo :get "/fox.txt"
                         {:handler       ajax-handler
                          :error-handler ajax-error-handler
                          :headers       {"custom" "something"}
                          }])

人们可以在Chrome开发者控制台中看到标头来自以下位置:

:awt-localstore-load-intc--loaded-value-1 {}
core.cljs:192 :awt-ajax-intc--ajax => {:method :get, :uri "/fox.txt", :handler #object[flintstones$core$ajax_handler], :error-handler #object[flintstones$core$ajax_error_handler], :headers {"custom" "something"}}
core.cljs:192 :awt-ajax-intc--opts-map => {:handler #object[flintstones$core$ajax_handler], :error-handler #object[flintstones$core$ajax_error_handler], :headers {"custom" "something"}}

如果您想尝试一下,可以克隆此仓库:git@github.com:cloojure / cljs-enflame.git

然后运行:

lein clean
lein figwheel 

并看到它在浏览器中运行。

答案 1 :(得分:0)

浏览器将发送“预检” OPTIONS请求,以验证是否允许发送“自定义”请求标头。该服务器应该通过回复“ Access-Control-Allow-Headers”来批准。

请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS