clojurescript http请求返回空

时间:2020-05-23 19:12:48

标签: http clojure request clojurescript

我正在尝试使用clojure / clojurescript分别为后端/前端构建一个简单的Web应用程序。我在通过http请求建立两者之间的通信时遇到问题,我觉得我的问题在前端,但是我不确定。

这是我的后端代码:

  (ns example.handler
  (:require [compojure.core :refer :all]
            [compojure.route :as route]
            [clojure.data.json :as json]
            [clj-http.client :as client]
            [datomic.api :as d]
            [ring.util.response :as resp]
            [ring.middleware.defaults :refer [wrap-defaults site-defaults]])
  (:use [hiccup.core]))


  ;; Route
  (defroutes app-routes
    (GET "/info" [] (json/write-str {:data (some-function x)})))

到目前为止,当我转到localhost:3000/info时,在浏览器上看到类似{"data":10}之类的东西,这是预期的结果。我读到,使用cljs-http是clojurescript请求的标准,因此我遵循了仓库中的简单示例,我的代码如下:

(ns example-cljs.core
  (:require [reagent.core :as reagent :refer [atom]]
            [clojure.core.async :as async]
            [cljs-http.client :as http]))

(def example-req (atom nil))

(defn get-data []
  (async/go
    (let [response (async/<! (http/get "localhost:3000/info"))]
      (reset! example-req response))))

但是响应只是{:status 0, :success true, :body "", :headers {}, :trace-redirects ["localhost:3000/info" "localhost:3000/info"], :error-code :no-error, :error-text ""}

我觉得这是一个菜鸟错误,但是我根本找不到它。

感谢您的帮助或提示。

1 个答案:

答案 0 :(得分:0)

因此,经过一番研究后,我发现this教程是这样的,所以我只是复制粘贴发现可以解决问题的内容:

将ring-cors依赖项添加到project.clj中的hello-compojure。

 :dependencies [[org.clojure/clojure "1.10.0"]
                 [org.clojure/tools.nrepl "0.2.13"]
                 [com.datomic/datomic-pro "0.9.6024"]
                 [org.clojure/data.json "0.2.6"]
                 [ring-cors "0.1.13"]
                 [compojure "1.6.1"]
                 [hiccup "1.0.5"]
                 [ring/ring-defaults "0.3.2"]]

在服务器的handler.clj中需要它。

(ns hello-compojure.handler
      (:require [compojure.core :refer :all]
                [compojure.route :as route]
                [datomic.api :as d]
                [clojure.data.json :as json]
                [ring.util.response :as resp]
                [ring.middleware.cors :refer [wrap-cors]]
                [ring.middleware.defaults :refer [wrap-defaults site-defaults]])

最后用以下命令替换handler.clj中的应用程序定义:

(def app
  (-> app-routes
      (wrap-cors :access-control-allow-origin [#".*"]
                 :access-control-allow-methods [:post :get]
                 :access-control-allow-credentials "true"
                 :access-control-allow-headers "Content-Type, Accept, Authorization, Authentication, If-Match, If-None-Match, If-Modified-Since, If-Unmodified-Since")
      (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))))