2009-10-02 29 views
5

Tôi đang xây dựng API clojure cho trang web của mình về cơ bản là trình bao bọc xung quanh API web gốc. Một trong những tính năng mà tôi không thể thực hiện là gửi tệp qua các yêu cầu POST, về cơ bản những gì tôi sẽ làm trong trình bao với curl -F foo=bar [email protected] foobar.com.Tôi làm cách nào để gửi tệp trong yêu cầu POST?

Tôi đang sử dụng clojure-http-client và ban đầu đã thử biểu mẫu (resourcefully/post "foobar.com" {} {:foo "bar" :baz (File. "bak.jpg")}), nhưng trường: baz bị bỏ qua bởi tập lệnh nhận, như thể tôi đã gửi chỉ: foo. Sau đó, tôi đã thử thay đổi File. thành FileInputStream, vì [dòng 51] [2] của client.clj dường như đang kiểm tra cho lớp cụ thể này, nhưng vẫn có kết quả tương tự.

Sau đó, tôi đã tạo một trang php chỉ đơn giản in $ _POST để kiểm tra yêu cầu của tôi, và rõ ràng dữ liệu của đối tượng đang được gửi theo nghĩa đen. Hãy xem:

Clojure => (resourcefully/bài "http://ptchan.org/pttest.php" {} {: foo "bar": baz "/tmp/bak.jpg"}) { : body-seq ("mảng" "(" "[foo] => bar" "[baz] => /tmp/bak.jpg" ")"),: mã 200,: msg "OK",: phương thức "POST",: tiêu đề {: date ("Fri, 02 Oct 2009 11:41:15 GMT"),: thay đổi ("Accept-Encoding"),: content-length ("53"),: connection ("close"),: content-type (" text/html "),: máy chủ (" Apache/2.2.9 (Debian) PHP/5.2.6-1 + lenny3 với Suhosin-Patch "),: x-powered-by (" PHP/5.2.6-1 + lenny3 ")},: get-header #,: cookies nil,: url" http://ptchan.org/pttest.php "}

Clojure => (resourcefully/post" http://ptchan.org/pttest.php "{} {: foo" bar ": baz (Tệp."/tmp/bak.jpg ")}) {: body-seq ("Array" "(" "[foo] => bar" "[baz] => /tmp/bak.jpg" ")"),: mã 200,: msg "OK",: phương thức "POST",: tiêu đề {: date ("Fri, 02 Oct 2009 11:41:30 GMT"),: thay đổi ("Accept-Encoding"),: content-length ("53"),: connection (" close "),: content-type (" text/html "),: server (" Apache/2.2.9 (Debian) PHP/5.2.6-1 + lenny3 với Suhosin-Patch "),: x-powered-by ("PHP/5.2.6-1 + lenny3")},: get-header #,: cookies nil,: url "http://ptchan.org/pttest.php"}

Clojure => (resourcefully/post "http://ptchan.org/pttest.php" {} {: foo "bar": baz (FileInputStream. "/tmp/bak.jpg")}) {: body-seq ("Array" "(" "[foo] => bar" "[baz] => [email protected]" ")") ,: mã 200,: msg "OK",: phương thức "POST",: tiêu đề {: date ("Fri, 02 Oct 2009 11:41:47 GMT"),: thay đổi ("Accept-Encoding"),: content -length ("73"),: connection ("close"),: content-type ("text/html"),: server ("Apache/2.2.9 (Debian) PHP/5.2.6-1 + lenny3 với Suhosin-patch "),: x-powered-by (" PHP/5.2.6-1 + lenny3 ")},: get-tiêu đề #,: cookie nil,: url" http://ptchan.org/pttest.php "}

tôi 'không thực sự chắc chắn làm thế nào để tiến hành. Bất kì lời đề nghị nào? Mẹo chung về gỡ lỗi cũng được hoan nghênh!

Cảm ơn

+2

+1 để sử dụng lisp. ^^ – KB22

Trả lời

4

Hãy thử sử dụng clojure-apache-http, trình bao bọc Clojure cho các thư viện HTTP Apache đầy đủ tính năng. Nó hỗ trợ POST/dữ liệu biểu mẫu.

3

Tôi không chắc là có thể sử dụng clojure-http-client. Theo như tôi thấy in the source code, nếu bạn chuyển một bản đồ làm đối số cơ thể, URL sẽ mã hóa mọi phần tử và gửi nó. Dường như bạn chỉ có thể POST các tệp như toàn bộ các đối tượng, mà không có bất kỳ đối số nào khác. Vì vậy, nu hỗ trợ cho multipart.

(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))) 
Các vấn đề liên quan