網絡
使用Chromium的原生網絡庫發出HTTP / HTTPS請求
進程:主進程
net 模塊是一個發送 HTTP(S) 請求的客戶端API。 它類似於Node.js的HTTP 和 HTTPS 模塊 ,但它使用的是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構造函數選項。
使用 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。sessionObject (可選) - 與請求相關聯的Session實例.partitionString (可選) - 與請求相關聯的partition名稱. 默認為空字符串.session選項優先於partition選項. 因此, 如果session是顯式指定的, 則partition將被忽略.useSessionCookies布爾值(可選)-是否從提供的會話中發送帶有此請求的cookie。這將使net請求的cookie行為與fetch請求匹配。默認值false。protocol字符串(可選)-協議方案,格式為“方案:”。當前支持的值為“ http:”或“ https:”。默認為“ http:”。hostString (可選) - 作為連接提供的服務器主機,主機名和端口號'hostname:port'.hostnameString (可選) - 服務器主機名.portInteger (可選) - 服務器偵聽的端口號.pathString (可選) - 請求URL的路徑部分.redirectString (可選) - 請求的重定向模式. 可選值為follow,error或manual. 默認值為follow. 當模式為error時, 重定向將被終止. When mode ismanualthe redirection will be cancelled unlessrequest.followRedirectis invoked synchronously during theredirectevent.
options 屬性,如 protocol, host, hostname, port 和 path,在 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'
返回:
errorError -提供失敗信息的錯誤對象。
當 net網絡模塊沒有發出網絡請求時會觸發。 通常情況下,當 request請求對象發出一個 error錯誤事件時,一個 close關閉事件會隨之發生,並且不會提供響應對象。
在
事件: 'close'
作為HTTP 的 request-response 中的最后一個事件發出。 close事件表明,在request或response 對象中不會發出更多的事件。
在
事件: 'redirect'
返回:
statusCode整數method串redirectUrl串responseHeaders記錄<字符串,字符串[]>
服務器返回重定向響應(例如301永久移動)時發出。呼叫request.followRedirect將繼續進行重定向。如果處理了此事件,則request.followRedirect必須同步調用,否則請求將被取消。
在
實例屬性
在
request.chunkedEncoding
一個Boolean類型的值,指定請求是否將使用 HTTP 分塊傳輸編碼。 默認值為 false. 該屬性是可讀寫的, 但它只能在第一次寫入操作之前設置,因為還沒有寫入 HTTP 頭。 在第一寫入后如果設置chunkedEncoding屬性將引發錯誤。
如果 request 的 body 是一個大的數據時,強烈建議使用塊編碼。因為數據將以小塊的方式進行傳輸, 而不是在 Electron 進程內存中內部緩沖。
在
實例方法
在
request.setHeader(name, value)
nameString - 額外的 HTTP 頭名稱.value字符串-額外的HTTP標頭值。
添加一個額外的 HTTP 頭。 The header name will be issued as-is without lowercasing. 它只能在第一次寫入之前調用。 在第一次寫入后調用此方法將引發錯誤。 如果傳遞的值不是 String, 則會調用 toString () 方法來獲取最終值。
某些標頭禁止由應用程序設置。這些標題在下面列出。在Chromium的標頭utils中可以找到有關受限標頭的更多信息。
Content-LengthHostTrailer要么TeUpgradeCookie2Keep-AliveTransfer-Encoding
此外,也不允許將Connection標頭設置為該值upgrade。
在
request.getHeader(name)
nameString - 指定一個額外的頭名稱.
返回String-先前設置的額外標題名稱的值。
在
request.removeHeader(name)
nameString - 指定一個額外的頭名稱.
刪除先前設置的額外標題名稱。只能在首次寫入之前調用此方法。首次寫入后嘗試調用它會引發錯誤。
在
request.write(chunk[, encoding\][, callback])
chunk(字符串|緩沖區)-請求正文的數據塊。如果是字符串,則使用指定的編碼將其轉換為Buffer。encoding字符串(可選)-用於將字符串塊轉換為Buffer對象。默認為'utf-8'。callbackFunction (可選)-在寫操作結束后調用。
callback 實質上是為了保持與 Node.js API 的相似性而引入的虛擬函數。 在將 chunk 內容傳遞到 Chromium 網絡層之后, 在下一個 tick 中異步調用。 與 Node.js 實現相反, 不保證 chunk 內容在調用 callback 之前已經被刷新。
向請求正文中添加一個數據塊。 第一次寫操作可能導致在線路上發出請求頭。 在第一次寫入操作后, 不允許添加或刪除自定義標頭。
在
request.end([chunk\][, encoding][, callback])
chunk(String | Buffer) (可選)encodingString (可選)callbackFunction (可選)
發送請求數據的最后一塊。隨后的寫或結束操作將被禁止。該finish事件在結束操作之后發出。
在
request.abort()
取消正在進行的 HTTP 事務。 如果請求已發出 close 事件, 則中止操作將不起作用。 否則正在進行的事件將發出 abort 和 close 事件。 此外, 如果有一個正在進行的響應對象, 它將發出 aborted 事件。
在
request.followRedirect()
繼續所有待處理的重定向。只能在'redirect'活動期間調用。
在
request.getUploadProgress()
返回 Object:
active布爾值-請求當前是否處於活動狀態。如果為false,則不會設置其他屬性started布爾值-上傳是否開始。如果這是假的都current和total將被設置為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>

