Electron 網絡模塊


網絡

使用Chromium的原生網絡庫發出HTTP / HTTPS請求

進程:主進程

net 模塊是一個發送 HTTP(S) 請求的客戶端API。 它類似於Node.js的HTTPHTTPS 模塊 ,但它使用的是Chromium原生網絡庫來替代Node.js的實現,提供更好的網絡代理支持。

下面是一個非詳盡的列表, 用於說明為什么使用 net 模塊而不是原生Node. js 模塊:

  • 系統代理配置的自動管理, 支持 wpad 協議和代理 pac 配置文件。
  • HTTPS 請求的自動隧道。
  • 支持使用basic、digest、NTLM、Kerberos 或協商身份驗證方案對代理進行身份驗證。
  • 支持傳輸監控代理: 類似於Fiddler代理,用於訪問控制和監視。

API組件(包括類,方法,屬性和事件名稱)與Node.js中使用的組件相似。

用法示例:

const { app } = require('electron')
app.whenReady().then(() => {
  const { net } = require('electron')
  const request = net.request('https://github.com')
  request.on('response', (response) => {
    console.log(`STATUS: ${response.statusCode}`)
    console.log(`HEADERS: ${JSON.stringify(response.headers)}`)
    response.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`)
    })
    response.on('end', () => {
      console.log('No more data in response.')
    })
  })
  request.end()
})

netAPI可以在應用程序發出后才能使用ready事件。在ready事件發生前嘗試使用模塊將引發錯誤。

方法

net 模塊具有以下方法:

net.request(options)

  • options(ClientRequestConstructorOptions |字符串)-ClientRequest構造函數選項。

返回 ClientRequest

使用 options 創建 ClientRequest 實例, 這些選項直接轉發到 ClientRequest 的構造函數。 net.request 方法將根據 options 對象中的指定協議方案, 去發送安全和不安全的 HTTP 請求( both secure and insecure HTTP requests)。

類: ClientRequest

發起HTTP/HTTPS請求.

進程:主進程

ClientRequest實現了Writable Stream接口, 因此是一個EventEmitter類型.

new ClientRequest(options)

  •   options
    

    (對象|字符串)-如果

    options
    

    為字符串,則將其解釋為請求URL。如果它是一個對象,則期望通過以下屬性完全指定一個HTTP請求:

    • method字符串(可選)-HTTP請求方法。默認為GET方法。
    • url字符串(可選)-請求URL。必須以絕對形式提供,協議方案指定為http或https。
    • session Object (可選) - 與請求相關聯的Session實例.
    • partition String (可選) - 與請求相關聯的partition名稱. 默認為空字符串. session選項優先於partition選項. 因此, 如果session是顯式指定的, 則partition將被忽略.
    • useSessionCookies布爾值(可選)-是否從提供的會話中發送帶有此請求的cookie。這將使net請求的cookie行為與fetch請求匹配。默認值false
    • protocol字符串(可選)-協議方案,格式為“方案:”。當前支持的值為“ http:”或“ https:”。默認為“ http:”。
    • host String (可選) - 作為連接提供的服務器主機,主機名和端口號'hostname:port'.
    • hostname String (可選) - 服務器主機名.
    • port Integer (可選) - 服務器偵聽的端口號.
    • path String (可選) - 請求URL的路徑部分.
    • redirect String (可選) - 請求的重定向模式. 可選值為 follow, errormanual. 默認值為 follow. 當模式為error時, 重定向將被終止. When mode is manual the redirection will be cancelled unless request.followRedirect is invoked synchronously during the redirect event.

options 屬性,如 protocol, host, hostname, portpath,在 URL 模塊中會嚴格遵循 Node.js 的模式

例如,我們可以創建與github.com相同的請求如下:

const request = net.request({
  method: 'GET',
  protocol: 'https:',
  hostname: 'github.com',
  port: 443,
  path: '/'
})

實例事件

事件: 'response'

返回:

  • response 收到的消息 - 表示HTTP響應消息的對象。

事件: "login"

返回:

  •   authInfo
    

    目的

    • isProxy 布爾型
    • scheme
    • host
    • port 整數
    • realm
  •   callback
    

    功能

    • username 字符串(可選)
    • password 字符串(可選)

當身份驗證代理請求用戶認證時觸發

用戶證書會調用 callback方法:

  • username
  • password
request.on('login', (authInfo, callback) => {
  callback('username', 'password')
})
復制

提供空的憑證將取消請求,並在響應對象上報告一個身份驗證錯誤:

request.on('response', (response) => {
  console.log(`STATUS: ${response.statusCode}`);
  response.on('error', (error) => {
    console.log(`ERROR: ${JSON.stringify(error)}`)
  })
})
request.on('login', (authInfo, callback) => {
  callback()
})
復制

事件:'finish'

request 最終的 chunk 數據后寫入 request 后觸發

事件: 'abort'

request終止時發出。abort如果request已經關閉,則不會觸發該事件。

事件: 'error'

返回:

  • error Error -提供失敗信息的錯誤對象。

net網絡模塊沒有發出網絡請求時會觸發。 通常情況下,當 request請求對象發出一個 error錯誤事件時,一個 close關閉事件會隨之發生,並且不會提供響應對象。

事件: 'close'

作為HTTP 的 request-response 中的最后一個事件發出。 close事件表明,在requestresponse 對象中不會發出更多的事件。

事件: 'redirect'

返回:

  • statusCode 整數
  • method
  • redirectUrl
  • responseHeaders 記錄<字符串,字符串[]>

服務器返回重定向響應(例如301永久移動)時發出。呼叫request.followRedirect將繼續進行重定向。如果處理了此事件,則request.followRedirect必須同步調用,否則請求將被取消。

實例屬性

request.chunkedEncoding

一個Boolean類型的值,指定請求是否將使用 HTTP 分塊傳輸編碼。 默認值為 false. 該屬性是可讀寫的, 但它只能在第一次寫入操作之前設置,因為還沒有寫入 HTTP 頭。 在第一寫入后如果設置chunkedEncoding屬性將引發錯誤。

如果 request 的 body 是一個大的數據時,強烈建議使用塊編碼。因為數據將以小塊的方式進行傳輸, 而不是在 Electron 進程內存中內部緩沖。

實例方法

request.setHeader(name, value)

  • name String - 額外的 HTTP 頭名稱.
  • value 字符串-額外的HTTP標頭值。

添加一個額外的 HTTP 頭。 The header name will be issued as-is without lowercasing. 它只能在第一次寫入之前調用。 在第一次寫入后調用此方法將引發錯誤。 如果傳遞的值不是 String, 則會調用 toString () 方法來獲取最終值。

某些標頭禁止由應用程序設置。這些標題在下面列出。在Chromium的標頭utils中可以找到有關受限標頭的更多信息。

  • Content-Length
  • Host
  • Trailer 要么 Te
  • Upgrade
  • Cookie2
  • Keep-Alive
  • Transfer-Encoding

此外,也不允許將Connection標頭設置為該值upgrade

request.getHeader(name)

  • name String - 指定一個額外的頭名稱.

返回String-先前設置的額外標題名稱的值。

request.removeHeader(name)

  • name String - 指定一個額外的頭名稱.

刪除先前設置的額外標題名稱。只能在首次寫入之前調用此方法。首次寫入后嘗試調用它會引發錯誤。

request.write(chunk[, encoding\][, callback])

  • chunk(字符串|緩沖區)-請求正文的數據塊。如果是字符串,則使用指定的編碼將其轉換為Buffer。
  • encoding字符串(可選)-用於將字符串塊轉換為Buffer對象。默認為'utf-8'。
  • callback Function (可選)-在寫操作結束后調用。

callback 實質上是為了保持與 Node.js API 的相似性而引入的虛擬函數。 在將 chunk 內容傳遞到 Chromium 網絡層之后, 在下一個 tick 中異步調用。 與 Node.js 實現相反, 不保證 chunk 內容在調用 callback 之前已經被刷新。

向請求正文中添加一個數據塊。 第一次寫操作可能導致在線路上發出請求頭。 在第一次寫入操作后, 不允許添加或刪除自定義標頭。

request.end([chunk\][, encoding][, callback])

  • chunk (String | Buffer) (可選)
  • encoding String (可選)
  • callback Function (可選)

發送請求數據的最后一塊。隨后的寫或結束操作將被禁止。該finish事件在結束操作之后發出。

request.abort()

取消正在進行的 HTTP 事務。 如果請求已發出 close 事件, 則中止操作將不起作用。 否則正在進行的事件將發出 abortclose 事件。 此外, 如果有一個正在進行的響應對象, 它將發出 aborted 事件。

request.followRedirect()

繼續所有待處理的重定向。只能在'redirect'活動期間調用。

request.getUploadProgress()

返回 Object:

  • active布爾值-請求當前是否處於活動狀態。如果為false,則不會設置其他屬性
  • started布爾值-上傳是否開始。如果這是假的都currenttotal將被設置為0。
  • current 整數-到目前為止已上傳的字節數
  • total 整數-此請求將上載的字節數

您可以使用此方法獲取使用 POST 請求的文件上傳或其他數據傳輸的進度

案例

點擊訪問百度

渲染進程

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>網絡</title>
</head>
<body>
<h1>網絡</h1>
<button onclick="accessbaidu()">點擊訪問百度</button>
</body>
<script>
    function accessbaidu() {
        const { net } = require('electron').remote;
        const request = net.request('https://www.baidu.com')
        request.on('response', (response) => {
            console.log(`STATUS: ${response.statusCode}`)
            console.log(`HEADERS: ${JSON.stringify(response.headers)}`)
            response.on('data', (chunk) => {
                console.log(`接受到數據: ${chunk}`)
            })
            response.on('end', () => {
                console.log('數據接受完成.')
            })
        })
        //結束請求
        request.end()
    }
</script>
</html>

image-20210204170907673


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM