簡體   English   中英

422在Clojure中發布文件上傳時無法處理的實體響應

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM