如何在ClojureScript的GET请求中传递请求体?
ClojureScript中GET请求带请求体的替代方案
直接使用XMLHttpRequest(XHR)原生API
cljs-ajax和re-frame-http-fx默认会遵循部分HTTP规范的处理逻辑,限制GET请求携带body,直接用原生XHR可以绕开这个限制:
(defn get-with-body [url body on-success on-error] (let [xhr (js/XMLHttpRequest.)] (.open xhr "GET" url true) (.setRequestHeader xhr "Content-Type" "application/json") (aset xhr "onload" (fn [] (if (= (.-status xhr) 200) (on-success (.parse js/JSON (.-responseText xhr))) (on-error (.-statusText xhr))))) (aset xhr "onerror" (fn [] (on-error "Network error"))) (.send xhr (.stringify js/JSON (clj->js body)))))
调用示例:
(get-with-body "/api/your-target-endpoint" {:filter "some-condition" :page 1} (fn [res] (println "请求成功:" res)) (fn [err] (println "请求失败:" err)))
使用fetch原生API
fetch API同样支持给GET请求配置body,不过要注意部分浏览器或后端服务的兼容性:
(defn fetch-get-with-body [url body] (-> (js/fetch url #js {:method "GET" :headers #js {"Content-Type" "application/json"} :body (.stringify js/JSON (clj->js body))}) (.then (fn [response] (if (.-ok response) (.json response) (js/Promise.reject (.-statusText response))))) (.then (fn [data] (js->clj data :keywordize-keys true))) (.catch (fn [err] (println "请求出错:" err)))))
调用示例:
(fetch-get-with-body "/api/your-target-endpoint" {:ids [1 2 3]})
关键注意事项
- 尽管HTTP规范未明确禁止GET请求带body,但并非所有后端框架、代理或CDN都支持这种用法,要确保服务端链路能正常解析
- 若使用自定义请求头,需提前确认是否存在跨域相关限制
内容的提问来源于stack exchange,提问作者Vinícius Araújo
相关产品推荐
相关产品推荐

