在 Clojure 中使用 clj-http 发布请求 - 正文不被接受?

Vin*_*inn 5 post clojure clj-http

通过我的发布请求,我希望发布的 CRM API 文档也要求我发布 JSON 文件。

JSON 文件是一个多级文件,在 clojure 中被视为持久数组映射。

我要发布的代码是:

(def contacts (http/post "https://api.close.com/api/v1/data/search" 
           {:basic-auth [api ""]
            :body closeFilter 
            })) 
Run Code Online (Sandbox Code Playgroud)

CloseFilter 代表我希望发布的多级 JSON。

但是,我收到以下错误:

class clojure.lang.PersistentArrayMap cannot be cast to class [B (clojure.lang.PersistentArrayMap is in unnamed module of loader 'app'; [B is in module java.base of loader 'bootstrap')

我在这里犯了什么错误?

更新

我正在用 Javascript 重新创建一个程序。发布相同的文件效果很好。

更新 2 - MRE

我仍然在努力解决这个问题,所以这是我的代码示例。

我的代码首先需要我需要的包:

(ns schedule-emails.core
  (:require [clj-http.client :as http]
            [clojure.data.json :as json]
            [cheshire.core :refer :all]))
Run Code Online (Sandbox Code Playgroud)

然后,我将文件系统中的本地 JSON 文件解析到应用程序中。JSON。这将返回带有嵌入向量的地图的地图。

(def closeFilter
  (json/read-str
   (slurp "URL TO LOCAL FILE")))
Run Code Online (Sandbox Code Playgroud)

最后,我想将这些信息从本地文件发布到软件中:

def contacts (http/post "API URL HERE"
           {:accept :json
            :as :json
            :content-type :json
            :basic-auth [api ""]
            :body closeFilter}))
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

class clojure.lang.PersistentArrayMap cannot be cast to class [B (clojure.lang.PersistentArrayMap is in unnamed module of loader 'app'; [B is in module java.base of loader 'bootstrap')

我也尝试了下面建议的解决方案,但我遇到了同样的问题。

cfr*_*ick 1

clj-http它本身不会与某些后端协商它所期望的内容并“自动”强制传输数据。但是,在 JSON 的情况下,您可以进行配置,以便某些具有正确内容类型的数据将从正文转换为请求,并使用 JSON 将其转换回响应中的数据。

  1. 因此,您通常希望请求中包含以下内容:

    {:as :auto
     :coerce :always
     :content-type :application/json
     :body ...
     ; your own additional stuff...
     }
    
    Run Code Online (Sandbox Code Playgroud)

    因此添加一个 mime-type,这样 clj-http 就知道要做什么,后端也知道它得到什么。

    请参阅输入强制输出强制

  2. 你必须确保有使其真正发挥作用的方法。这意味着您已添加cheshire为依赖项。查看可选依赖项

当然,另一种选择是自己处理这个问题。因此,您需要添加一个库,它可以从字符串或流创建 JSON,content-type并转换正文/响应。