2009-10-02 24 views
5

Web sitemde temel web API'sı etrafında temel olarak bir sarıcı olan bir clojure API'si yapıyorum. Uygulayamadığım özelliklerden biri, POST istekleriyle dosya yollamaktır, temel olarak curl -F foo=bar [email protected] foobar.com ile kabukta ne yapardım.POST isteğinde bir dosyayı nasıl gönderebilirim?

clojure-http-client kullanıyorum ve başlangıçta (resourcefully/post "foobar.com" {} {:foo "bar" :baz (File. "bak.jpg")}) formunu denedim, ancak: baz alan, yalnızca gönderdiğim gibi alma komut dosyası tarafından yoksayıldı: foo. Daha sonra File.'u FileInputStream olarak değiştirmeyi denedim, çünkü client.clj'nin bu satırı [51] [2], bu sınıfı sınıyor gibi görünüyor, ancak yine de aynı sonuçları alıyor.

Ardından isteğimi kontrol etmek için $ _POST yazdıran bir php sayfası oluşturdum ve görünüşe göre nesnelerin verileri tam anlamıyla gönderiliyor.

Clojure => (resourcefully/post "http://ptchan.org/pttest.php" {} {: foo "bar": baz "/tmp/bak.jpg"}) {: vücut devamı ("Dizi" bir göz atın "(" "[foo] => bar" "[baz] => /tmp/bak.jpg" ")"): kod 200,: msg "Tamam",: "POST" yöntemi: başlıklar {: date ("Cum, 02 Ekim 2009 11:41:15 GMT"),: değişir ("Kabul-Kodlama"),: content-length ("53"),: bağlantı ("close"):: content-type (" text/html "),: sunucu (" Apache/2.2.9 (Debian) PHP/5.2.6-1 + Suhosin-Patch ile lenny3 "): x-powered-by (" PHP/5.2.6-1 + " lenny3 ")},: get-header #: kurabiye nil,: url" http://ptchan.org/pttest.php "}

Clojure => (resourcefully/post" http://ptchan.org/pttest.php "{} {: foo "bar". baz (Dosya"/tmp/bak.jpg ")}) {: body-seq ("Array" "(" "[foo] => bar" "[baz] => /tmp/bak.jpg" ")"),: kod 200,: msg "Tamam",: "POST",: başlıklar {: date ("Cum, 02 Ekim 2009 11:41:30 GMT") ,: değişir ("Kabul-Kodlama"),: content-length ("53"),: bağlantı (" close "),: content-type (" text/html "),: server (" Apache/2.2.9 (Debian) PHP/5.2.6-1 + Suhosin-Patch ile lenny3 "): x-powered-by ("PHP/5.2.6-1 + lenny3")},:, #-başlık olsun: kurabiye nil,: url "http://ptchan.org/pttest.php "}

Clojure => (resourcefully/post" http://ptchan.org/pttest.php" {} {: foo "çubuk": baz (FileInputStream. "/tmp/bak.jpg")}) {: body-seq ("Array" "(" "[foo] => bar" "[baz] => [email protected]" ")") ,: kod 200,: msg "Tamam",: yöntem "POST",: başlıklar {: date ("Cum, 02 Ekim 2009 11:41:47 GMT"),: değişir ("Accept-Encoding"),: content -length ("73"),: bağlantı ("close"),: content-type ("text/html"),: server ("Apache/2.2.9 (Debian) PHP/5.2.6-1 + lenny3 ile birlikte Suhosin-Yama "): x-powered by (" PHP/5.2.6-1 + lenny3 ")},: get-header #: kurabiye nil,: url" http://ptchan.org/pttest.php "}

ben Nasıl devam edeceğinden emin değilim. Herhangi bir öneri? Hata ayıklama hakkında genel ipuçları da açığız!

Teşekkür

+2

+1. ^^ – KB22

cevap

4

clojure-apache-http, tam özellikli Apache HTTP kütüphaneleri için Clojure sarmalayıcı kullanmayı deneyin. Multart/form-data POST'u destekler. Lisp kullanımı için

3

Ben Clojure-http-istemcisi kullanarak mümkün olduğundan emin değilim. in the source code'u gördüğüm kadarıyla, bir haritayı vücut bağımsız değişkeni olarak aktarırsanız, URL her öğeyi kodlar ve gönderir. Başka hiçbir argümana gerek duymadan dosyaları sadece tüm dosya olarak POST yapabilirsiniz. Yani multipart için nu desteği.

(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))) 
İlgili konular