我有下面的卷发请求-
`curl --socks5 #{proxy} --connect-timeout 10 -H "Accept: application/json" #{url}`我想写一个法拉第请求而不是卷发电话。我要这么做-
faraday = Faraday.new("#{url}", ssl:{verify: false} do |f|
f.proxy "#{proxy}"
end
faraday.get我得到一个回复,但响应没有主体或标题。以下是回应-
#<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 ...>>>我在这里做错什么了?
发布于 2016-04-10 19:13:01
向Faraday的转换最困难的问题是您需要使用SOCKS5代理。法拉第不支持袜子代理(有一个打开拉-请求这个)。
唯一的解决办法是使用猴子补丁Faraday来使用 创业板,它为Net::HTTP (默认的法拉第网络适配器)添加了对SOCKS代理的支持。这个过程在 这个要旨中有很好的描述,我主要在这里复制粘贴一个稍微修改过的版本。
基本上,您需要遵循以下步骤:
faraday和socksify宝石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)末端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以使用证书存储来验证对等证书。这是完整文档化的这里。
发布于 2016-04-10 10:17:52
例如,我是如何在post请求中使用faraday从获取访问令牌的。
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希望能帮上忙。
https://stackoverflow.com/questions/36434141
复制相似问题