簡體   English   中英

將curl調用轉換為法拉第請求

[英]converting a curl call to a faraday request

我有以下卷曲要求-

`curl --socks5 #{proxy} --connect-timeout 10 -H "Accept: application/json" #{url}`

我想寫一個法拉第請求而不是curl調用。 我正在這樣做-

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 ...>>>

我在這里做錯了什么?

轉換為法拉第最困難的問題是您需要使用SOCKS5代理。 Faraday不支持SOCKS代理(對此存在公開拉取請求 )。

解決此問題的唯一方法是對法拉第(Faraday )進行猴子修補,以使用socksify gemsocksifyNet::HTTP (默認的法拉第網絡適配器)添加了對SOCKS代理的支持。 該過程在本要點中得到了很好的描述,這里主要復制並粘貼了稍作改動的版本。

基本上,您需要執行以下步驟:

  1. 安裝faradaysocksify寶石
  2. 猴子補丁法拉第支持SOCKS。 將此代碼放入Rails初始化程序中。 請注意,該補丁僅在不需要對SOCKS代理進行身份驗證時才適用(如curl命令建議的那樣)。 如果您需要代理身份驗證,請參見要點以獲取支持該更新的補丁程序版本。 補丁如下:

     class Faraday::Adapter::NetHttp def net_http_connection(env) if proxy = env[:request][:proxy] if proxy[:socks] Net::HTTP::SOCKSProxy(proxy[:uri].host, proxy[:uri].port) else Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:uri].user, proxy[:uri].password) end else Net::HTTP end.new(env[:url].host, env[:url].port) end end 
  3. 創建請求。 我注意到您可能正在嘗試發出HTTPS請求,因此我考慮了這一點以及curl參數中的超時:

     PROXY_OPTS = { uri: URI.parse('https://proxy_url:1080'), socks: true } SSL_OPTS = { verify: false } connection = Faraday.new(url: "https://example.com", ssl: SSL_OPTS, request: { proxy: PROXY_OPTS }) do |faraday| faraday.options.timeout = 10 # open/read timeout in seconds faraday.options.open_timeout = 10 # connection open timeout in seconds faraday.response :logger # log debug info faraday.adapter :net_http # use the Net:HTTP adapter faraday.headers['Accept'] = 'application/json' # your custom headers end response = connection.get response.body 

最后,請注意,忽略對等驗證( verify: false SSL選項中為verify: false )是不安全的! 相反,您應該正確配置Faraday以使用證書存儲來驗證對等證書。 這是完整記錄在這里

例如,這就是我使用法拉第發布請求以從Microsoft Exchange API獲取訪問令牌的方式。

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

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM