首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将curl调用转换为faraday请求

将curl调用转换为faraday请求
EN

Stack Overflow用户
提问于 2016-04-05 18:23:02
回答 2查看 2.2K关注 0票数 4

我有下面的卷发请求-

代码语言:javascript
复制
`curl --socks5 #{proxy} --connect-timeout 10 -H "Accept: application/json" #{url}`

我想写一个法拉第请求而不是卷发电话。我要这么做-

代码语言:javascript
复制
faraday =  Faraday.new("#{url}", ssl:{verify: false} do |f|
    f.proxy "#{proxy}"
end
faraday.get

我得到一个回复,但响应没有主体或标题。以下是回应-

代码语言:javascript
复制
#<Faraday::Response:0x0056075d353ad0 @on_complete_callbacks=[], @env=#<Faraday::Env @method=:get @url=#<URI::HTTP:0x0056075d358328 URL:main_url> @request=#<Faraday::RequestOptions proxy=#<Faraday::ProxyOptions uri=#<URI::HTTP:0x0056075dce69d0 URL:proxy_url>>> @request_headers={"User-Agent"=>"Faraday v0.9.2"} @ssl=#<Faraday::SSLOptions (empty)> @response=#<Faraday::Response:0x0056075d353ad0 ...>>>

我在这里做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-10 19:13:01

向Faraday的转换最困难的问题是您需要使用SOCKS5代理。法拉第不支持袜子代理(有一个打开拉-请求这个)。

唯一的解决办法是使用猴子补丁Faraday来使用 创业板,它为Net::HTTP (默认的法拉第网络适配器)添加了对SOCKS代理的支持。这个过程在 这个要旨中有很好的描述,我主要在这里复制粘贴一个稍微修改过的版本。

基本上,您需要遵循以下步骤:

  1. 安装faradaysocksify宝石
  2. 猴子贴片法拉第来支撑袜子。将此代码放入Rails初始化程序中。注意,该修补程序仅适用于不需要对SOCKS代理进行身份验证的情况(正如您的curl命令所建议的)。如果需要代理身份验证,请参阅gist以获得支持该身份验证的修补程序版本。该补丁程序如下: 类Faraday::适配器::NetHttp net_http_connection(env)如果代理=env:请求if代理:SOCKSProxy::HTTP::SOCKSProxy(proxy:uri.host,proxy:uri.port) else::HTTP::proxy (proxy:uri.host,proxy:uri.port,proxy:uri.user,proxy:uri.password) end socks::HTTP end.new(env:url.host,( env:url.port)末端
  3. 创建请求。我注意到您可能正在尝试发出HTTPS请求,因此我考虑了这一点,以及curl参数中的超时: PROXY_OPTS ={ uri: URI.parse('网址:1080‘),socks: true } SSL_OPTS ={ false :false} connection = Faraday.new(url:"https://example.com",ssl: SSL_OPTS,请求:{ proxy: PROXY_OPTS })

最后,请注意忽略对等验证( SSL选项中的verify: false)是不安全的!相反,您应该正确地配置Faraday以使用证书存储来验证对等证书。这是完整文档化的这里

票数 5
EN

Stack Overflow用户

发布于 2016-04-10 10:17:52

例如,我是如何在post请求中使用faraday从获取访问令牌的。

代码语言:javascript
复制
url = "https://login.microsoftonline.com/#{ENV['TENANT']}/oauth2/token"

conn = Faraday.new url: url do |faraday|
  faraday.request  :url_encoded             # form-encode POST params
  faraday.response :logger                  # log requests to STDOUT
  faraday.adapter  Faraday.default_adapter  # make requests with Net::HTTP
end

response = conn.post do |req|
  req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
  req.body = {
    client_id: URI::encode(ENV['CLIENT_ID']),
    client_secret: URI::encode(ENV['CLIENT_SECRET']),
    resource: URI::encode('https://graph.microsoft.com'),
    grant_type: URI::encode('client_credentials'),
  }
  Rails.logger.info "Body #{req.body.inspect}"
end

if response.status.to_i == 200
  response_body = ActiveSupport::JSON.decode(response.body)
  return response_body['access_token']
else
  return false
end

希望能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36434141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档