【问题标题】:Post Request in Clojure with clj-http - body not accepted?使用 clj-http 在 Clojure 中发布请求 - 不接受正文?
【发布时间】:2022-06-12 18:19:34
【问题描述】:

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

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

我要发布的代码是:

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

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]))

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

(def closeFilter
  (json/read-str
   (slurp "URL TO LOCAL FILE")))

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

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

但是,我收到以下错误:

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')

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

【问题讨论】:

    标签: post clojure clj-http


    【解决方案1】:

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

    1. 所以你通常想要以下的东西 在请求中:

      {:as :auto
       :coerce :always
       :content-type :application/json
       :body ...
       ; your own additional stuff...
       }
      

      所以添加一个 mime-type,这样 clj-http 都知道要做什么,后端也知道 得到什么。

      input coercionoutput coercion

    2. 并且您必须确保使其真正发挥作用的方法 在那儿。这意味着,您已将 cheshire 添加为依赖项。 见optional dependencies

    当然,另一种选择是自己处理。所以你会 添加了一个库,可以从/到字符串或流创建 JSON, content-type 并转换正文/响应。

    【讨论】:

    • 谢谢。我添加了强制并添加了:as :json 和内容类型。但我仍然得到同样的错误。对于上下文,closeFilter 来自一个从文件系统读取 JSON 文件的变量。
    • 你加了柴郡吗?
    • 是的,我从一开始就安装了 cheshire。
    • 那我建议你提供一个MRE
    • 嗨@cfrick - 我按照你的建议添加了一个 MRE。我希望这能澄清我正在尝试做的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    • 2021-08-25
    • 2016-03-12
    相关资源
    最近更新 更多