You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:15:31