试图在ruby中发出curl请求

时间:2012-10-18 00:20:25

标签: ruby-on-rails curl google-checkout curb

是否有红宝石卷曲库,允许我复制此请求:

curl -d '<hello xmlns="http://checkout.google.com/schema/2"/>' https://S_MERCHANT_ID:S_MERCHANT_KEY@sandbox.google.com/checkout/api/checkout/v2/request/Merchant/S_MERCHANT_ID

我尝试过curb,但是他们的PostField.content类没有与google的checkout api合作。这是我的路边请求中的代码:

c = Curl::Easy.new("https://MY_ID:MY_KEY@sandbox.google.com/checkout/api/checkout/v2/request/Merchant/MY_ID_AGAIN")
c.http_auth_types = :basic
c.username = 'MY_ID'
c.password = 'MY_KEY'
# c.headers["data"] = '<?xml version="1.0" encoding="UTF-8"?><hello xmlns="http://checkout.google.com/schema/2"/>'
c.http_post(Curl::PostField.content('', '<?xml version="1.0" encoding="UTF-8"?><hello xmlns="http://checkout.google.com/schema/2"/>'))
c.perform

我已经设法使用ruby的系统命令让它工作,但我不知道如何处理它的响应。

req = system("curl -d '<hello xmlns=\"http://checkout.google.com/schema/2\"/>' https://MY_ID:MY_KEY@sandbox.google.com/checkout/api/checkout/v2/request/Merchant/MY_ID")

我已经在这里待了2个小时了。任何帮助将不胜感激,谢谢!

5 个答案:

答案 0 :(得分:2)

您可以使用IO.popen来读取子进程:

IO.popen(['curl', '-o', '-', '-d', ..., err: [:child, :out]]) do |io|
  response = io.read
end

此示例将标准输出和标准错误合并到子进程中的一个流中,并强制curl通过-o将输出重定向到标准输出。您可以指定其他选项来代替...

答案 1 :(得分:1)

我总是将Rest Client gem用于此类用例,它使用起来非常简单,所有REST请求都是开箱即用的整批调优参数。

您的代码看起来与此类似:

url = "sandbox.google.com/checkout/api/checkout/v2/request/Merchant/#{S_MERCHANT_ID}"
credentials = "#{S_MERCHANT_ID}:#{S_MERCHANT_KEY}"
RestClient.post "https://credentials@#{url}", '<hello xmlns="http://checkout.google.com/schema/2"/>' 

答案 2 :(得分:0)

或者,您可以使用HTTP请求库,例如Typheous(https://github.com/typhoeus/typhoeus)。有没有什么可以让你“卷曲”?

答案 3 :(得分:0)

我会把结果放在一个文件中,然后使用ruby打开文件并读取它(File.open)

或者我们httparty

答案 4 :(得分:0)

我想通了(YAAAAY!)

如果有其他人遇到这个问题,这就是解决方案。

可执行命令在命令行中运行正常,但如果您尝试从rails中的控制器呈现可执行命令的输出,请确保使用render:json而不是render:text来打印结果。

由于某种原因,渲染:文本只输出我命令输出的一些部分(并在此过程中让我疯狂)。

对于那些尝试与Google中的Google Checkout集成的人,以下是您向Google发送http请求的方式:

第一步:将rest-client添加到您的Gemfile中。以下是如何从命令行执行此操作:

$ cd /path/to/your/rails/app
$ sudo nano Gemfile

接下来,通过将以下内容放在Gemfile

中,将gem添加到gem文件中
$ gem "rest-client"

接下来,运行bundle install

$ bundle install

重新启动服务器。如果是apache2:

$ sudo service apache2 reload

如果webrick:

$ rails s

然后,在您的控制器中(假设您已设置了rails并且能够从浏览器访问控制器),请编写以下代码:

$ url = "https://YOUR_GOOGLE_CHECKOUT_MERCHANT_ID:YOUR_GOOGLE_CHECKOUT_KEY@sandbox.google.com/checkout/api/checkout/v2/request/Merchant/YOUR_GOOGLE_CHECKOUT_MERCHANT_ID"
$ req = RestClient.post(url, '<hello xmlns="http://checkout.google.com/schema/2"/>')
render :json => req

请不要忘记将YOUR_GOOGLE_MERCHANT_ID替换为您的实际商家ID,并将YOUR_GOOGLE_CHECKOUT_KEY替换为您的实际Google Checkout密钥

<?xml version="1.0" encoding="UTF-8"?>
<bye xmlns="http://checkout.google.com/schema/2" serial-number="1dfc3b90-1fa6-47ea-a585-4d5482b6c785" />

(由nexo提供答案)