<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # Ruby Faraday 教程 > 原文: [https://zetcode.com/web/rubyfaraday/](https://zetcode.com/web/rubyfaraday/) 在本教程中,我們展示了如何使用 Ruby Faraday 模塊。 我們獲取數據,發布數據,使用 JSON 并連接到安全的網頁。 我們還創建了一個自定義的 Faraday 中間件。 本教程使用 Sinatra 應用作為幾個示例。 ZetCode 也有一個簡潔的 [Ruby 教程](/lang/rubytutorial/)。 超文本傳輸??協議(HTTP)是用于分布式協作超媒體信息系統的應用協議。 HTTP 是萬維網數據通信的基礎。 Ruby `Faraday`是一個簡單,靈活的 HTTP 客戶端庫,支持多個后端。 Faraday 也是一種中間件。 ```ruby $ sudo gem install faraday ``` 該模塊通過`sudo gem install faraday`命令安裝。 ## Sinatra Sinatra 是流行的 Ruby Web 應用框架。 它易于安裝和設置。 我們的一些示例還將使用 Sinatra 應用。 ```ruby $ sudo gem install sinatra $ sudo gem install thin ``` 我們安裝 Sinatra 和 Thin Web 服務器。 如果安裝了 Thin,Sinatra 會自動選擇默認 WEBrick 服務器上的 Thin。 ```ruby $ pwd /home/janbodnar/prog/sinatra/first $ ls main.rb ``` 在第一個目錄中,我們有一個`main.rb`文件,它是 Sinatra 應用文件。 `main.rb` ```ruby require 'sinatra' get '/' do "First application" end ``` 應用對`/`路由做出反應。 它將一條簡單的消息發送回客戶端。 ```ruby $ ruby main.rb == Sinatra (v1.4.7) has taken the stage on 4567 for development with backup from Thin Thin web server (v1.6.4 codename Gob Bluth) Maximum connections set to 1024 Listening on localhost:4567, CTRL+C to stop ``` 使用`ruby main.rb`命令啟動應用。 瘦服務器啟動; 它在 4567 端口上監聽。 ```ruby $ curl localhost:4567/ First application ``` 使用`curl`命令行工具,我們連接到服務器并訪問`/`路由。 一條消息出現在控制臺上。 ## 版本 第一個 Faraday 程序將打印庫和 Ruby 語言的版本。 `version.rb` ```ruby #!/usr/bin/ruby require 'faraday' puts Faraday::VERSION puts Faraday::default_adapter ``` 這兩個常數提供了庫的版本號和默認的 Faraday 適配器。 ```ruby $ ./version.rb 0.9.2 net_http ``` 這是字符串的示例輸出。 ## 獲取內容 `get`方法獲取由給定 URL 標識的文檔。 `get_content.rb` ```ruby #!/usr/bin/ruby require 'faraday' res = Faraday.get 'http://www.something.com' puts res.body ``` 該腳本獲取`www.something.com`網頁的內容。 ```ruby $ ./get_content.rb <html><head><title>Something.</title></head> <body>Something.</body> </html> ``` 這是`get_content.rb`腳本的輸出。 以下程序獲取一個小型網頁,并剝離其 HTML 標簽。 `strip_tags.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday::Connection.new "http://www.something.com" res = con.get puts res.body.gsub(%r{</?[^>]+?>}, '') ``` 該腳本會剝離`www.something.com`網頁的 HTML 標簽。 ```ruby puts res.body.gsub(%r{</?[^>]+?>}, '') ``` 一個簡單的正則表達式用于剝離 HTML 標記。 ```ruby $ ./strip_tags.rb Something. Something. ``` 該腳本將打印網頁的標題和內容。 ## 狀態 `Faraday::Response`的`status`方法返回響應的 HTTP 狀態代碼。 `status.rb` ```ruby #!/usr/bin/ruby require 'faraday' res = Faraday.get 'http://www.something.com' puts res.status puts res.success? res = Faraday.get 'http://www.something.com/news/' puts res.status puts res.success? res = Faraday.get 'http://www.urbandicionary.com/define.php?term=Dog' puts res.status puts res.success? ``` 我們使用`get`方法執行三個 HTTP 請求,并檢查返回狀態。 ```ruby res = Faraday.get 'http://www.something.com' puts res.status ``` 使用`status`方法檢查 HTTP 響應的狀態。 ```ruby puts res.success? ``` `success?`方法指示狀態代碼是否成功。 ```ruby $ ./status.rb 200 true 404 false 302 false ``` 200 是對成功的 HTTP 請求的標準響應,404 指示找不到請求的資源,302 指示該資源已臨時重定向。 ## `head`方法 `head`方法檢索文檔標題。 標頭由字段組成,包括日期,服務器,內容類型或上次修改時間。 `head.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new :url => "http://www.something.com" res = con.head puts res.headers['server'] puts res.headers['date'] puts res.headers['last-modified'] puts res.headers['content-type'] puts res.headers['content-length'] ``` 該示例打印`www.something.com`網頁的服務器,日期,上次修改時間,內容類型和內容長度。 ```ruby $ ./head.rb Apache/2.4.12 (FreeBSD) OpenSSL/1.0.1l-freebsd mod_fastcgi/mod_fastcgi-SNAP-0910052141 Tue, 10 May 2016 10:19:01 GMT Mon, 25 Oct 1999 15:36:02 GMT text/html 77 ``` 這是`head.rb`程序的輸出。 ## `get`方法 `get`方法向服務器發出 GET 請求。 GET 方法請求指定資源的表示形式。 `main.rb` ```ruby require 'sinatra' get '/greet' do "Hello #{params[:name]}" end ``` 這是 Sinatra 應用文件。 收到`/greet`路由后,它將返回一條消息,其中包含客戶端發送的名稱。 `mget.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new res = con.get 'http://localhost:4567/greet', { :name => 'Peter' } puts res.body ``` 該腳本將具有值的變量發送到 Sinatra 應用。 該變量直接在 URL 中指定。 ```ruby $ ./mget.rb Hello Peter ``` 這是示例的輸出。 ```ruby 127.0.0.1 - - [10/May/2016:22:04:38 +0200] "GET /greet?name=Peter HTTP/1.1" 200 11 0.0034 ``` 在瘦服務器的此日志中,我們可以看到參數已編碼到 URL 中。 `get`方法采用第二個參數,我們可以在其中指定查詢參數。 `mget2.rb` ```ruby #!/usr/bin/ruby require 'faraday' res = Faraday.get do |req| req.url 'http://localhost/greet' req.params['name'] = 'Jan' end puts res.body ``` 這是發出 GET 消息的另一種方式。 ```ruby $ ./mget2.rb Hello Peter ``` This is the output of the example. ## 用戶代理 在本節中,我們指定用戶代理的名稱。 `main.rb` ```ruby require 'sinatra' get '/agent' do request.user_agent end ``` Sinatra 應用返回客戶端發送的用戶代理。 `agent.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new res = con.get do |req| req.url 'http://localhost:4567/agent' req.headers['User-Agent'] = 'Ruby script' end puts res.body ``` 該腳本向 Sinatra 應用創建一個簡單的 GET 請求。 ```ruby res = con.get do |req| req.url 'http://localhost:4567/agent' req.headers['User-Agent'] = 'Ruby script' end ``` 用戶代理在請求的`headers`屬性中指定。 ```ruby $ ./agent.rb Ruby script ``` 服務器使用我們隨請求發送的代理名稱進行了響應。 ## `post`方法 `post`方法在給定的 URL 上調度 POST 請求,為填寫的表單內容提供鍵/值對。 `main.rb` ```ruby require 'sinatra' post '/target' do "Hello #{params[:name]}" end ``` Sinatra 應用在`/target`路由上返回問候語。 它從`params`哈希中獲取值。 `mpost.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new 'http://localhost' res = con.post '/target', { :name => 'Jan' } puts res.body ``` 腳本使用具有`Jan`值的`name`鍵發送請求。 POST 請求通過`post`方法發出。 ```ruby $ ./mpost.rb Hello Jan ``` 這是`mpost.rb`腳本的輸出。 ```ruby 127.0.0.1 - - [11/May/2016:13:49:44 +0200] "POST /target HTTP/1.1" 200 9 0.0006 ``` 使用 POST 方法時,不會在請求 URL 中發送該值。 ## 從字典中檢索定義 在以下示例中,我們在 [www.dictionary.com](http://www.dictionary.com) 上找到術語的定義。 要解析 HTML,我們使用`nokogiri`。 可以使用`sudo gem install nokogiri`命令安裝。 `get_term.rb` ```ruby #!/usr/bin/ruby require 'faraday' require 'nokogiri' term = 'dog' con = Faraday.new :url => 'http://www.dictionary.com/browse/'+term res = con.get doc = Nokogiri::HTML res.body doc.css("div.def-content").map do |node| s = node.text.strip! s.gsub!(/\s{3,}/, " ") unless (s == nil) puts s unless (s == nil) end ``` 在此腳本中,我們在`www.dictionary.com`上找到了術語狗的定義。 `Nokogiri::HTML`用于解析 HTML 代碼。 ```ruby con = Faraday.new :url => 'http://www.dictionary.com/browse/'+term ``` 為了執行搜索,我們在 URL 的末尾附加了該詞。 ```ruby doc = Nokogiri::HTML res.body doc.css("div.def-content").map do |node| s = node.text.strip! s.gsub!(/\s{3,}/, " ") unless (s == nil) puts s unless (s == nil) end ``` 我們使用`Nokogiri::HTML`類解析內容。 定義位于`<div class="def-content">`標簽內。 我們通過刪除過多的空白來改善格式。 ## JSON 格式 JSON (JavaScript 對象表示法)是一種輕量級的數據交換格式。 人類很容易讀寫,機器也很容易解析和生成。 ```ruby $ sudo gem install json ``` 如果以前沒有安裝過,則必須安裝`json`包。 `main.rb` ```ruby require 'sinatra' require 'json' get '/example.json' do content_type :json { :name => 'Jane', :age => 17 }.to_json end ``` Sinatra 應用發送 JSON 數據。 它使用`to_json`方法完成工作。 `parse_json.rb` ```ruby #!/usr/bin/ruby require 'faraday' require 'json' con = Faraday.new :url => 'http://localhost:4567/example.json' res = con.get data = JSON.parse res.body puts data["name"] puts data["age"] ``` 該示例讀取 Sinatra 應用發送的 JSON 數據。 ```ruby $ ./parse_json.rb Jane 17 ``` This is the output of the example. 接下來,我們從 Ruby 腳本將 JSON 數據發送到 Sinatra 應用。 `main.rb` ```ruby require 'sinatra' require 'json' post '/readjson' do data = JSON.parse request.body.read puts data "#{data["name"]} is #{data["age"]} years old" end ``` 該應用讀取 JSON 數據并發送回帶有已解析值的消息。 `post_json.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new res = con.post do |req| req.url 'http://localhost:4567/readjson' req.headers['Content-Type'] = 'application/json' req.body = '{ "name": "Jane", "age": 17 }' end puts res.body ``` 該腳本將 JSON 數據發送到 Sinatra 應用并讀取其響應。 ```ruby req.headers['Content-Type'] = 'application/json' ``` 必須在請求中指定`'application/json'`內容類型。 ```ruby $ ./post_json.rb Jane is 17 years old ``` This is the output of the example. ## 證書 `basic_auth`方法設置用于領域的名稱和密碼。 安全領域是一種用于保護 Web 應用資源的機制。 ```ruby $ sudo gem install sinatra-basic-auth ``` 對于此示例,我們需要安裝`sinatra-basic-auth`包。 `main.rb` ```ruby require 'sinatra' require "sinatra/basic_auth" authorize do |username, password| username == "user7" && password == "7user" end get '/' do "hello" end protect do get "/secure" do "This is restricted area" end end ``` 在 Sinatra 應用中,我們指定授權邏輯并設置受保護的路由。 `credentials.rb` ```ruby #!/usr/bin/ruby require 'faraday' con = Faraday.new :url => 'http://localhost/secure/' user = 'user7' passwd = '7user' con.basic_auth user, passwd res = con.get puts res.body ``` 該腳本連接到安全網頁; 它提供訪問該頁面所需的用戶名和密碼。 ```ruby $ ./credentials.rb This is restricted area ``` 使用正確的憑據,`credentials.rb`腳本返回受限制的數據。 ## Faraday 中間件 中間件是連接兩個原本獨立的應用的軟件。 除了作為 HTTP 客戶端之外,Faraday 還充當中間件。 這個概念與 Ruby Rack 非常相似。 `Faraday::Connection`包含一個中間件列表。 Faraday 中間件傳遞有請求和響應信息的`env`哈希。 中間件可以在執行請求之前和之后操縱此信息。 ### 重定向 重定向是將一個 URL 轉發到另一個 URL 的過程。 HTTP 響應狀態代碼 302 用于臨時 URL 重定向。 重定向是在 Faraday 中間件模塊之一中實現的。 ```ruby $ sudo gem install faraday_middleware ``` 這些模塊在`faraday_middleware`包中可用。 `main.rb` ```ruby require 'sinatra' get "/oldpage" do redirect to("/files/newpage.html"), 302 end ``` 在 Sinatra 應用中,我們使用`redirect`命令重定向到其他位置。 `newpage.html` ```ruby <!DOCTYPE html> <html> <head> <title>New page</title> </head> <body> <p> This is a new page </p> </body> </html> ``` 這是位于`public/files`子目錄中的`newpage.html`文件。 `redirect.rb` ```ruby #!/usr/bin/ruby require 'faraday' require 'faraday_middleware' con = Faraday.new 'http://localhost:4567/oldpage' do |con| con.use FaradayMiddleware::FollowRedirects, limit: 5 con.adapter Faraday.default_adapter end res = con.get puts res.body ``` 該腳本訪問舊頁面并遵循重定向。 ```ruby $ ./redirect.rb <!DOCTYPE html> <html> <head> <title>New page</title> </head> <body> <p> This is a new page </p> </body> </html> ``` This is the output of the example. ```ruby 127.0.0.1 - - [10/May/2016:22:14:16 +0200] "GET /oldpage HTTP/1.1" 302 - 0.0199 127.0.0.1 - - [10/May/2016:22:14:16 +0200] "GET /files/newpage.html HTTP/1.1" 200 113 0.0073 ``` 從日志中,我們可以看到該請求已重定向到新的文件名。 通信包含兩個 GET 消息。 ### MyLogger 在以下示例中,我們創建了自己的小型中間件。 它實現了請求和響應日志記錄。 `main.rb` ```ruby require 'sinatra' get '/greet' do "Hello #{params[:name]}" end ``` 這是一個 Sinatra 應用,它向客戶端發送問候語。 `logger.rb` ```ruby #!/usr/bin/ruby require 'faraday' require 'logger' class MyLogger def initialize app @app = app @logger = Logger.new(STDOUT) end def call env on_request("request", env) @app.call(env).on_complete do on_response("response", env) end end private def on_request phase, env @logger.info("#{phase} : #{env.method} - #{env.url}") if env.method and env.url end private def on_response phase, env @logger.info("#{phase} : #{env.body}") if env.body end end con = Faraday.new(:url => "http://localhost:4567") do |build| build.request :url_encoded build.use MyLogger build.adapter Faraday.default_adapter end res = con.get "/greet", {'name' => 'Jan'} ``` 在這里,我們創建一個中間件,該中間件實現了對控制臺的日志記錄。 ```ruby def call env on_request("request", env) @app.call(env).on_complete do on_response("response", env) end end ``` 中間件必須實現`call`方法。 它執行用于請求和響應的方法。 ```ruby private def on_request phase, env @logger.info("#{phase} : #{env.method} - #{env.url}") if env.method and env.url end ``` 生成請求后,將調用`on_request`方法。 該方法記錄階段,請求方法和 URL。 ```ruby con = Faraday.new(:url => "http://localhost:4567") do |build| build.request :url_encoded build.use MyLogger build.adapter Faraday.default_adapter end ``` `MyLogger`中間件通過`use`方法添加到棧中。 當連接對象執行請求時,它將創建一個共享的`env`哈希,將外部中間件包裝在每個內部中間件周圍,并執行`call`方法。 ```ruby res = con.get "/greet", {'name' => 'Jan'} ``` 一條消息發送到 Sinatra 應用。 該請求和響應被記錄到終端。 ```ruby $ ./logger.rb I, [2016-05-11T14:48:55.700198 #4945] INFO -- : request : get - http://localhost:4567/greet?name=Jan I, [2016-05-11T14:48:55.706989 #4945] INFO -- : response : Hello Jan ``` This is the output of the example. 在本教程中,我們使用了 Ruby Faraday 模塊。 在 ZetCode 上有類似的 [Ruby HTTPClient 教程](/web/rubyhttpclient/)和 [Ruby Net :: HTTP 教程](/web/rubynethttp/)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看