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