2014-03-13 28 views
0

我用Ruby腳本掙扎使用他們的HTTP接口我試圖使用捲曲:: Easy.http_put但有一些問題與數據參數

這裏上傳一些圖片moodstocks是代碼,我迄今

curb = Curl::Easy.new 
curb.http_auth_types = :digest 
curb.username = MS_API 
curb.password = MS_SECRET 
curb.multipart_form_post = true 

Dir.foreach(images_directory) do |image| 
    if image.include? '.jpg' 
    path = images_directory + image 
    filename = File.basename(path, File.extname(path)) 

    puts "Upload #{path} with id #{filename}" 

    raw_url = 'http://api.moodstocks.com/v2/ref/' + filename 
    encoded_url = URI.parse URI.encode raw_url 

    curb.url = encoded_url 
    curb.http_put(Curl::PostField.file('image_file', path)) 
    end 
end 

,這是錯誤,我得到

/Library/Ruby/Gems/2.0.0/gems/curb-0.8.5/lib/curl/easy.rb:57:in `add': no implicit  conversion of nil into String (TypeError) 
    from /Library/Ruby/Gems/2.0.0/gems/curb-0.8.5/lib/curl/easy.rb:57:in `perform' 
    from upload_moodstocks.rb:37:in `http_put' 
    from upload_moodstocks.rb:37:in `block in <main>' 
    from upload_moodstocks.rb:22:in `foreach' 
    from upload_moodstocks.rb:22:in `<main>' 

我認爲這個問題是我如何給參數的http_put的方法,但我試圖尋找一些考試Curl :: Easy.http_put並沒有發現任何東西。

任何人都可以給我一些關於它的文檔或者幫我解決這個問題。

預先感謝您

回答

2

這裏有幾個問題:

1 URI :: HTTP而不是字符串

首先,TypeError遇到來自與您傳遞的事實一個URI::HTTP實例(encoded_url)作爲curb.url而不是普通的Ruby字符串。

你可能想要使用encoded_url.to_s,但問題是你爲什麼要在這裏解析/編碼?

2. PUT瓦特/多部分/格式數據

第二個問題涉及curb。在撰寫本文時(v0.8.5),限制不是支持使用multipart/form-data編碼執行HTTP PUT請求的能力。

如果你指的是源代碼,你可以看到:

  1. multipart_form_post設定僅用於POST請求,
  2. put_data二傳手不支持Curl::PostField -s

要解決您的問題,您需要一個HTTP客戶端庫,可以結合摘要式身份驗證,multipart/form-data和HTTP PUT。

在Ruby中,您可以使用rufus-verbs,但您需要使用rest-client來構建多部分主體。

也有HTTParty但它有問題與摘要認證。

這就是爲什麼我非常建議用Python來繼續使用Requests:通過調用紅寶石使用「系統」命令curl命令的回答

import requests 
from requests.auth import HTTPDigestAuth 
import os 

MS_API_KEY = "kEy" 
MS_API_SECRET = "s3cr3t" 

filename = "sample.jpg" 

with open(filename, "r") as f: 
    base = os.path.basename(filename) 
    uid = os.path.splitext(base)[0] 

    r = requests.put(
    "http://api.moodstocks.com/v2/ref/%s" % uid, 
    auth = HTTPDigestAuth(MS_API_KEY, MS_API_SECRET), 
    files = {"image_file": (base, f.read())} 
) 

    print(r.status_code) 
+0

感謝,最後我解決了這個問題 – nucka