422 Необработанный ответ сущности при загрузке файла POSTing в Clojure

Я пытаюсь подражать этому запросу curl

curl "https://{subdomain}.zendesk.com/api/v2/uploads.json?filename=myfile.dat&token={optional_token}" \
  -v -u {email_address}:{password} \
  -H "Content-Type: application/binary" \
  --data-binary @file.dat -X POST

со следующим кодом

  (POST "/uploads" request
    (let [filename (get-in request [:params "file" :filename])
          file (get-in request [:params "file" :tempfile])
          url (str "https://REDACTED.zendesk.com/api/v2/uploads.json?filename=" filename)]
        (clj-http.client/post url {:headers {"Content-Type" “application/binary”}
                                   :multipart-params [{:name "file"
                                                       :content file
                                                       :mime-type "application/binary”}]})

но я получаю ответ "422 Unprocessable Entity" от Zendesk. Файл / временный файл приходит как #object[java.io.File 0x3768306f "/var/folders/l3/7by17gp51sx2gb2ggykwl9zc0000gn/T/ring-multipart-6501654841068837352.tmp"] по запросу.

Я играл с принудительными действиями clojure.java.io (например, clojure.java.io/output-stream), как упоминалось в разделе Сохранение формы изображения, запрос clj-http в файл, но это не помогло.

(PS. Я вполне уверен, что мне не нужно авторизоваться, потому что я могу получить прямую загрузку в Zendesk для работы через Postman.)

1 ответ

Решение

После повторного рассмотрения это решение было простым. Zendesk ожидает, что тело запроса будет двоичным (как указывает запрос curl). Итак, в этом случае я передал изображение на свой сервер в виде данных в кодировке base64 (так же, как JSON).

Затем я использовал эту библиотеку для преобразования строки base64 в байтовый массив: https://github.com/xsc/base64-clj

(defn byte-array-from-base64
  [base64-string]
  (base64/decode-bytes (.getBytes base64-string)))

Наконец, вы можете просто передать байтовый массив в Zendesk в качестве тела запроса библиотеки clj-http.

(client/post
  "https://REDACTED.zendesk.com/api/v2/uploads.jsonfilename=filename.jpg"
  {:headers {"Authorization" "Basic AUTHORIZATION_TOKEN"
             "Content-Type" "application/binary"}
   :body (byte-array-from-base64 base64-string)})
Другие вопросы по тегам