2013-05-08 32 views
2

我想下面的curl命令行到红宝石路沿石自动化:做一个帖子用Ruby遏制基本身份验证

curl -H "Content-Type:application/json" -X POST -d \ 
'{"approvalType": "auto", 
    "displayName": "Free API Product", 
    "name": "weather_free", 
    "proxies": [ "weatherapi" ], 
    "environments": [ "test" ]}' \ 
-u myname:mypass https://api.jupiter.apigee.net/v1/o/{org_name}/apiproducts 

凡MYNAME,为mypass和{组织名称}是运行脚本填充之前。

我不知道如何使用Ruby Curb使用基本身份验证来执行带有JSON负载的http post。我尝试了以下方法:

require 'json' 
require 'curb' 

payload = '{"approvalType": "auto", 
    "displayName": "Test API Product Through Ruby1", 
    "name": "test_ruby1", 
    "proxies": [ "weather" ], 
    "environments": [ "test" ]}' 

uri = 'https://api.jupiter.apigee.net/v1/o/apigee-qe/apiproducts' 
c = Curl::Easy.new(uri) 
c.http_auth_types = :basic 
c.username = 'myusername' 
c.password = 'mypassword' 
c.http_post(uri, payload) do |curl| 
    curl.headers["Content-Type"] = ["application/json"] 
end 

puts c.body_str 
puts c.response_code 

结果是一个空的正文和一个415响应代码。我证实了curl命令完美无缺。

任何帮助将不胜感激,因为它可以解决我现在正在处理的一整类问题。

+0

curl有-vv命令来显示详细的输出,你可以尝试相同的路边? – poseid 2013-05-08 16:20:19

回答

0

415响应码指示“服务器不支持媒体类型”。如果你像这样设置Content-Type(没有括号),它工作吗?

curl.headers["Content-Type"] = "application/json" 
+0

不幸的是,这并没有解决问题。我仍然得到一个空白的身体和415响应 – 2013-05-08 21:39:50

3

我用路边(0.8.5),并发现了,如果我再利用卷曲例如在多个请求(GET请求来保存cookie,然后发布数据)和HTTP_POST使用像

http_post(uri, payload) 
方法

它实际上发送URI和负载合并成单一的JSON请求(这当然导致了像“意外的字符(‘H’...”或“错误的请求”)的错误。

我设法得到它的工作,但我不得不使用有效载荷的方法作为单个参数:

c =Curl::Easy.new 
url = "http://someurl.com" 
headers={} 
headers['Content-Type']='application/json' 
headers['X-Requested-With']='XMLHttpRequest' 
headers['Accept']='application/json' 
payload = "{\"key\":\"value\"}" 

c.url = url 
c.headers=headers 
c.verbose=true 
c.http_post(payload) 

希望这会有所帮助。