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 重新创建一个程序。发布相同的文件效果很好。
我仍然在努力解决这个问题,所以这是我的代码示例。
我的代码首先需要我需要的包:
(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')
我也尝试了下面建议的解决方案,但我遇到了同样的问题。
clj-http它本身不会与某些后端协商它所期望的内容并“自动”强制传输数据。但是,在 JSON 的情况下,您可以进行配置,以便某些具有正确内容类型的数据将从正文转换为请求,并使用 JSON 将其转换回响应中的数据。
因此,您通常希望请求中包含以下内容:
{:as :auto
:coerce :always
:content-type :application/json
:body ...
; your own additional stuff...
}
Run Code Online (Sandbox Code Playgroud)
因此添加一个 mime-type,这样 clj-http 就知道要做什么,后端也知道它得到什么。
你必须确保有使其真正发挥作用的方法。这意味着您已添加cheshire为依赖项。查看可选依赖项
当然,另一种选择是自己处理这个问题。因此,您需要添加一个库,它可以从字符串或流创建 JSON,content-type并转换正文/响应。
| 归档时间: |
|
| 查看次数: |
978 次 |
| 最近记录: |