如何使用 ruby Faraday gem 执行以下 curl 请求?
Posted
技术标签:
【中文标题】如何使用 ruby Faraday gem 执行以下 curl 请求?【英文标题】:How to perform the following curl request using the ruby Faraday gem? 【发布时间】:2017-04-14 03:11:09 【问题描述】:这是我要执行的 curl 请求:
curl --request GET --url 'https://us8.api.mailchimp.com/3.0/' --user 'anystring:<apikey>'
从命令行运行这个 curl 命令,我得到了一堆 JSON,这正是我想要的。
我正在尝试使用法拉第执行相同的请求。这是我尝试过的:
conn = Faraday.new "https://us8.api.mailchimp.com/3.0/" do |faraday|
faraday.adapter Faraday.default_adapter
end
conn.basic_auth('apikey', <apikey>)
response = conn.get
puts response.body # => "<!DOCTYPE html PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<html><head>\n<title>301 Moved Permanently</title>\n</head>...
如何获取 JSON 而不是我在 response.body
中看到的 html?
【问题讨论】:
【参考方案1】:这最终对我有用:
conn = Faraday.new('https://us8.api.mailchimp.com/3.0/') do |c|
c.use FaradayMiddleware::ParseJson, content_type: "application/json"
c.use Faraday::Adapter::NetHttp
end
conn.basic_auth('apikey', <api_key>)
response = conn.get('campaigns')
puts response # => json blob
【讨论】:
【参考方案2】:这是使用 ruby gem 进行 curl 操作的 Farday 代码。
def contacts
response = JSON.parse(params)
@conn = Faraday.new('https://domain.example.com/api/v2/') do |farday|
farday.use FaradayMiddleware::ParseJson, content_type: "application/json"
farday.use Faraday::Adapter::NetHttp
end
@conn.basic_auth('apikey', <your_api_key>)
response = @conn.get('contacts')
puts response
render :json => "success" => true
end
【讨论】:
【参考方案3】:更简洁的选项是将您的凭据手动编码为 Base64 并手动设置 Authorization
标头。这样可以节省几行代码,并使其保持与常规法拉第请求类似的格式(即Faraday.post <URL>, <BODY>, <HEADERS>
)。
即
encoded_credentials = Base64.encode64('apikey:api_secret').chomp
Faraday.post 'http://myhost.local/my_url', , authorization: "Basic #encoded_credentials"
【讨论】:
以上是关于如何使用 ruby Faraday gem 执行以下 curl 请求?的主要内容,如果未能解决你的问题,请参考以下文章
Faraday::ConnectionFailed, Connection denied - connect(2) for “localhost” port 9200 Error Ruby on Ra
Could not find ‘json‘ (>= 1.5.1) among 45 total gem(s)