1

是否有一个 ruby​​ curl 库可以让我复制这个请求:

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

我试过遏制,但他们的 PostField.content 类不与谷歌的结帐 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 个小时了。任何帮助将不胜感激,谢谢!

4

5 回答 5

2

You can use IO.popen to read from the child process:

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

This example combines standard out and standard error into one stream in the child process, and it forces curl to redirect output to standard out via -o. You would specify your other options in place of the ....

于 2012-10-18T00:47:04.357 回答
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"/>' 
于 2012-10-18T05:00:14.030 回答
0

或者,您可以使用 HTTP 请求库,例如 Typheous (https://github.com/typhoeus/typhoeus)。有什么东西让你和“卷曲”联系在一起吗?

于 2012-10-18T00:27:34.520 回答
0

我会让 curl 将结果放入一个文件中,然后使用 ruby​​ 打开文件并读取它(File.open)

或者我们 httparty

于 2012-10-18T00:27:58.207 回答
0

我想通了(YAAAAY!)

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

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

由于某种原因,render :text 只输出了我的命令输出的点点滴滴(并且在这个过程中让我发疯)。

对于那些试图在 Rails 中与 google checkout 集成的人,以下是向 google 发出 http 请求的方式:

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

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

接下来,通过在 Gemfile 中的某处放置以下内容,将 gem 添加到 gemfile

$ gem "rest-client"

接下来,运行捆绑安装

$ bundle install

重新启动您的服务器。如果阿帕奇2:

$ 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 结帐密钥

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

(答案由nexo提供)

于 2012-10-18T20:34:30.777 回答