2014-03-13 9 views
0

데이터 인수와 함께 몇 가지 문제 컬 :: Easy.http_put를 사용하지만이하려고하는 코드입니다 I 나는 몇 가지 시험을 찾기 위해 노력했다 지금까지내가 자신의 HTTP 인터페이스 여기</p> <p>를 사용 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 당신은 당신이 통과한다는 사실에서 유래 발생 a URI::HTTP 인스턴스 (encoded_url)는 일반 Ruby 문자열 대신 curb.url입니다.

encoded_url.to_s을 사용하고 싶을 수도 있지만 질문은 왜 여기에서 파싱/인코딩합니까?

2. 다중 PUT/w/폼 데이터

는 제 curb 문제에 관한 것이다. 글을 쓸 때 (v0.8.5) 이 아닌multipart/form-data 인코딩으로 HTTP PUT 요청을 수행하는 기능을 지원합니다.

소스 코드를 참조하는 경우 해당을 볼 수

multipart_form_post 설정은 POST 요청을 사용
  1. ,
  2. put_data 세터가 지원하지 않는 Curl::PostField -s

문제를 해결하려면 다이제스트 인증, 다중/양식 데이터 및 HTTP PUT을 결합 할 수있는 HTTP 클라이언트 라이브러리가 필요합니다.

루비에서는 rufus-verbs을 사용할 수 있지만 멀티 파트 본문을 빌드하려면 rest-client을 사용해야합니다.

HTTParty도 있지만 다이제스트 인증과 관련된 문제가 있습니다. '시스템'명령을 사용하여 루비에서 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

감사 : 나는 크게 파이썬으로 가서 Requests를 사용하는 것이 좋습니다 이유

nucka