2009-10-02 15 views
5

私は自分のウェブサイトにclojure APIを構築しています。これは基本的に元のWeb APIのラッパーです。私が実装できない機能の1つは、POST要求によるファイル送信です。基本的にはシェルでcurl -F foo=bar [email protected] foobar.comを使ってやることです。POSTリクエストでファイルを送信するにはどうすればよいですか?

私は(resourcefully/post "foobar.com" {} {:foo "bar" :baz (File. "bak.jpg")})という形式を試しましたが、:bazフィールドは受信スクリプトによって無視されました。後で、私はFile.FileInputStreamに変更しようとしました.client.cljの[line 51] [2]がこの特定のクラスをチェックしているようですが、それでも同じ結果が得られました。

次に、私のリクエストをチェックするために単純に$ _POSTを出力するPHPページを作成しました。明らかにオブジェクトのデータが文字通り送られています。

のClojure =>(resourcefully/POST "http://ptchan.org/pttest.php" {} {:FOO "バー" バズ "/tmp/bak.jpg"}) {:ボディ配列( "アレイ" を見てください:msg "OK"、:メソッド "POST"、:ヘッダ:{:date( "boo" =>/tmp/bak.jpg " ( "Accept-Encoding")、:content-length( "53")、:connection( "close")、:content-type( "Fri、02 Oct 2009 11:41:15 GMT" PHP/5.2.6-1 + lenny3(Suhosin-Patch)」):x-powered-by( "PHP/5.2.6-1 + "http://ptchan.org/pttest.php"}

Clojure =>(リソースが多い/投稿 "http://ptchan.org/pttest.php" {} {:foo "bar":baz(file/"lenny3")}}:get-header#、:cookies nil、 tmp/bak.jpg ")})コード200、:msg "OK"、:msgstr "": "baz" =>/tmp/bak.jpg "") ") :("Accept-Encoding")、:content-length( "53")、:接続( "締め切り"、 " ( "Apache/2.2.9(Debian)PHP/5.2.6-1 + Suenosパッチ付きlenny3")、:x-powered-by ( "PHP/5.2.6-1 + lenny3")}:get-header#、:クッキーなし、:url "http://ptchan.org/pttest.php"}

Clojure =>(リソースが豊富/投稿 "http://ptchan.org/pttest.php" {} {:foo "bar":baz(FileInputStream。 ":" bar "" [baz] => [email protected] "") "):{:body-seq("配列 ""( "" [foo] =>バー ""/tmp/bak.jpg " 、:コード200、:msg "OK"、メソッド "POST"、:ヘッダー{:date( "Fri、02 Oct 2009 11:41:47 GMT")、:vary( "Accept-Encoding")、:content ( "Apache/2.2.9(Debian)PHP/5.2.6-1 + lenny3 with(" 73 ")、:接続("閉じる ")、コンテンツタイプ(" text/html " Suhosinパッチ "):Xパワー・バイ(" PHP/5.2.6-1 + lenny3 ")}、:取得ヘッダー#:クッキーゼロ、:URL" http://ptchan.org/pttest.php「}

Iどのように進むべきかわからない。なにか提案を?デバッグに関する一般的なヒントも歓迎します!私はそれがClojureの-HTTPクライアントを使用して可能だかわからない

おかげ

+2

+1 for lispを使用しています。 ^^ – KB22

答えて

4

フル機能のApache HTTPライブラリのClojureラッパーであるclojure-apache-httpを試してみてください。マルチパート/フォームデータPOSTをサポートしています。

3

。限り、私はin the source code参照してください、ボディ引数としてマップを渡すと、すべての要素をURLエンコードし、送信します。それ以外の引数はなく、本文全体としてファイルをPOSTできるだけです。マルチパートのためのnuサポート。

(let [out (.getOutputStream connection)] 
(cond 
    (string? body) (spit out body) 
    (map? body) (spit out (url-encode body)) 
    (instance? InputStream body) 
    (let [bytes (make-array Byte/TYPE 1000)] 
    (loop [#^InputStream stream body 
      bytes-read (.read stream bytes)] 
     (when (pos? bytes-read) 
     (.write out bytes 0 bytes-read) 
     (recur stream (.read stream bytes)))))) 
(.close out))) 
関連する問題