2013-05-10 1 views
6

나는 항복한다 - 나는이 너트를 깨는 데 수 시간 동안 노력했지만 그것을 이해할 수는 없다. 나는 Ruby에 대해 너무 익숙하지 않으며 (파이썬 배경이 없다!) 이것을 번역 한 다음 사용자/패스가 필요한 사이트에 내 JSON 데이터를 게시 한 다음 응답 데이터를 가져온다.Python에서 변환 한 후 Ruby에서 HTTP를 통해 JSON을 게시하는 방법은 무엇입니까?

r = requests.post('https://keychain.oneid.com/validate/', json.dumps(data), auth=('username', 'password')) 
r.json() 

data은 다음과 같습니다 :

파이썬 코드 내가 레일 응용 프로그램에 사용 루비에서이 코드의 기능을 복제하기 위해 노력하고있어

{"some" => "data", "fun" => "times"} 

하지만, 사이 어떻게 파이썬 requests.post() 함수가 작동하는지 알아 내고 POST와 GET을위한 Ruby 코드를 작성하면 완전히 없어졌습니다.

내가 노력 순 :: HTTP하지만 사용자 이름을 넣어해야하는지 내가 분명하지 않다/몸을 전달하거나 basic_auth 방법을 사용 - basic_authNet::HTTP.get 내부에서 작동하는 것 같다을 ... 그리고 인터넷 : HTTP JSON을 쉽게 처리하지 못하는 것 같지만이 시점에서 다시 점심을 먹을 수 있습니다.

모든 의견이나 도움을 주시면 대단히 감사하겠습니다.

답변

16

rest-client 보석을 사용하거나 Net::HTTP을 사용하십시오.

루비 코드 (버전 1.9.3) :

require 'net/http' 
require 'json' 
require 'uri' 

uri = URI('https://keychain.oneid.com/validate/') 
req = Net::HTTP::Post.new uri.path 
# ruby 2.0: req = Net::HTTP::Post.new uri 
req.basic_auth 'username', 'password' 
req.body = {:some => 'data', :fun => 'times'}.to_json 

res = Net::HTTP.start(uri.host, uri.port, :use_ssl => true) do |http| 
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE 
    http.ssl_version = :SSLv3 
    http.request req 
end 

puts res.body 
# => {"errorcode": -99, "error": "Invalid API credentials. Please verify and try again"} 

json = JSON.parse res.body 
puts json['errorcode'] 
# => -99 
+0

두 가지 -1) 어디 JSON 데이터가 전송됩니다? 2) "rrno :: ECONNRESET : 피어에 의한 연결 재설정 - SSL_connect"... 어떤 아이디어로도 오류가 있습니까? – Dan

+0

1) JSON 데이터를 추가하십시오 : req.body = {: some => 'data', : fun => 'times'}. to_json 2) 아마 OpenSSL 문제 일 수 있습니다 : http://stackoverflow.com/questions/11321403/ openssl-trouble-with-ruby-1-9-3 – zhongguoa

+0

대단히 고맙습니다. 매력처럼 작동합니다. 다른 사람이 OpenSSL 문제에 부딪혔다면이 리소스가 가장 좋았고 내 문제가 해결되었습니다. http://railsapps.github.io/openssl-certificate-verify-failed.html – Dan

3

RestClient 보석을 살펴 보는 것이 좋습니다. GET/POST와 나머지 REST 호출을 쉽게 처리 할 수 ​​있습니다. 또한 명령 줄에서 사용할 수있는 restclient이라는 IRB 기반 셸이 있으므로 연결 설정을 쉽게 테스트 할 수 있습니다. 문서에서

:

RestClient.post "http://example.com/resource", { 'x' => 1 }.to_json, :content_type => :json, :accept => :json 

당신은 파이썬 코드와 유사성을 볼 수 있습니다 그것을 찾고 있습니다.

당신은 해시에 인증 정보를 추가 할 수 있습니다

require 'restclient' 
require 'json' 
require 'base64' 

RestClient.post(
    'https://keychain.oneid.com/validate/', 
    { 
    :authentication => 'Basic ' + Base64.encode64(name + ':' + password), 
    'some' => 'data', 
    'fun' => 'times' 
    }.to_json, 
    :content_type => :json, 
    :accept => :json 
) 

다른 방법으로, 당신은 Curb 보석을 사용할 수 있습니다. Curb는 웹 연결을위한 업계 표준 도구 인 libcurl을 사용했습니다. 설명서에는 POST 요청을 보내는 여러 가지 방법이 나와 있습니다.

관련 문제