[英]422 Unprocessable Entity response when POSTing file upload in 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”}]})
但我從Zendesk收到“ 422無法處理的實體”響應。 在請求中,文件/臨時文件以#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進行工作。)
再次討論之后,解決方案很簡單。 Zendesk希望請求主體為二進制(如curl請求所指示)。 因此,在這種情況下,我將圖像作為base64編碼的數據(就像JSON)傳遞給服務器。
然后,我使用該庫將base64字符串轉換為字節數組: https : //github.com/xsc/base64-clj
(defn byte-array-from-base64
[base64-string]
(base64/decode-bytes (.getBytes base64-string)))
最后,您可以簡單地將字節數組作為clj-http庫請求的主體傳遞給Zendesk。
(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)})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.