2016-12-20 9 views
2

Я пытаюсь подражать этому локоны просьбы об422 Unprocessable Entity ответ при проводке загрузки файла в Clojure

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» из Зендеска. Файл/tempfile поступает как #object[java.io.File 0x3768306f "/var/folders/l3/7by17gp51sx2gb2ggykwl9zc0000gn/T/ring-multipart-6501654841068837352.tmp"] по запросу.

Я играл с clojure.java.io принуждениями (как clojure.java.io/output-stream), как упомянуто в Saving an image form clj-http request to file, но это не помогло.

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

ответ

0

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

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

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

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

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