2016-12-20 15 views
2

でファイルのアップロードを投稿するときは、私は次のコード422処理不能エンティティ応答Clojureの

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

でこのカールリクエスト

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 

をエミュレートしようとしていますが、私は「422加工不能エンティティの応答を取得していますZendeskから。ファイル/一時ファイルは、要求に応じて#object[java.io.File 0x3768306f "/var/folders/l3/7by17gp51sx2gb2ggykwl9zc0000gn/T/ring-multipart-6501654841068837352.tmp"]として入力されています。

Saving an image form clj-http request to fileで述べたように、私はclojure.java.io強制(たとえばclojure.java.io/output-stream)でプレイしましたが、それは役に立ちませんでした。

(私はZendeskへの直接アップロードがポストマンを通じて仕事を得ることができますので、PS。私はかなり確信している私はのauthする必要はありません。)

答えて

0

これを再訪した後に、解決策は単純でした。 Zendeskは、要求本体がバイナリであることを期待しています(カール要求が示すように)。そのため、この場合、イメージをサーバーに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)}) 
関連する問題