Electron 网络模块
網(wǎng)絡(luò)
使用Chromium的原生網(wǎng)絡(luò)庫發(fā)出HTTP / HTTPS請求
進程:主進程
net 模塊是一個發(fā)送 HTTP(S) 請求的客戶端API。 它類似于Node.js的HTTP 和 HTTPS 模塊 ,但它使用的是Chromium原生網(wǎng)絡(luò)庫來替代Node.js的實現(xiàn),提供更好的網(wǎng)絡(luò)代理支持。
下面是一個非詳盡的列表, 用于說明為什么使用 net 模塊而不是原生Node. js 模塊:
系統(tǒng)代理配置的自動管理, 支持 wpad 協(xié)議和代理 pac 配置文件。
HTTPS 請求的自動隧道。
支持使用basic、digest、NTLM、Kerberos 或協(xié)商身份驗證方案對代理進行身份驗證。
支持傳輸監(jiān)控代理: 類似于Fiddler代理,用于訪問控制和監(jiān)視。
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可以在應(yīng)用程序發(fā)出后才能使用ready事件。在ready事件發(fā)生前嘗試使用模塊將引發(fā)錯誤。
在
方法
net 模塊具有以下方法:
在
net.request(options)
options(ClientRequestConstructorOptions |字符串)-ClientRequest構(gòu)造函數(shù)選項。
返回 ClientRequest
使用 options 創(chuàng)建 ClientRequest 實例, 這些選項直接轉(zhuǎn)發(fā)到 ClientRequest 的構(gòu)造函數(shù)。 net.request 方法將根據(jù) options 對象中的指定協(xié)議方案, 去發(fā)送安全和不安全的 HTTP 請求( both secure and insecure HTTP requests)。
類: ClientRequest
發(fā)起HTTP/HTTPS請求.
進程:主進程
ClientRequest實現(xiàn)了Writable Stream接口, 因此是一個EventEmitter類型.
在
new ClientRequest(options)
options
(對象|字符串)-如果
options
為字符串,則將其解釋為請求URL。如果它是一個對象,則期望通過以下屬性完全指定一個HTTP請求:
method字符串(可選)-HTTP請求方法。默認為GET方法。
url字符串(可選)-請求URL。必須以絕對形式提供,協(xié)議方案指定為http或https。
session Object (可選) - 與請求相關(guān)聯(lián)的Session實例.
partition String (可選) - 與請求相關(guān)聯(lián)的partition名稱. 默認為空字符串. session選項優(yōu)先于partition選項. 因此, 如果session是顯式指定的, 則partition將被忽略.
useSessionCookies布爾值(可選)-是否從提供的會話中發(fā)送帶有此請求的cookie。這將使net請求的cookie行為與fetch請求匹配。默認值false。
protocol字符串(可選)-協(xié)議方案,格式為“方案:”。當(dāng)前支持的值為“ http:”或“ https:”。默認為“ http:”。
host String (可選) - 作為連接提供的服務(wù)器主機,主機名和端口號'hostname:port'.
hostname String (可選) - 服務(wù)器主機名.
port Integer (可選) - 服務(wù)器偵聽的端口號.
path String (可選) - 請求URL的路徑部分.
redirect String (可選) - 請求的重定向模式. 可選值為 follow, error 或 manual. 默認值為 follow. 當(dāng)模式為error時, 重定向?qū)⒈唤K止. When mode is manual the redirection will be cancelled unless request.followRedirect is invoked synchronously during the redirect event.
options 屬性,如 protocol, host, hostname, port 和 path,在 URL 模塊中會嚴格遵循 Node.js 的模式
例如,我們可以創(chuàng)建與github.com相同的請求如下:
const request = net.request({
method: 'GET',
protocol: 'https:',
hostname: 'github.com',
port: 443,
path: '/'
})
在
實例事件
在
事件: 'response'
返回:
response 收到的消息 - 表示HTTP響應(yīng)消息的對象。
在
事件: "login"
返回:
authInfo
目的
isProxy 布爾型
scheme 串
host 串
port 整數(shù)
realm 串
callback
功能
username 字符串(可選)
password 字符串(可選)
當(dāng)身份驗證代理請求用戶認證時觸發(fā)
用戶證書會調(diào)用 callback方法:
username 串
password 串
request.on('login', (authInfo, callback) => {
callback('username', 'password')
})
復(fù)制
提供空的憑證將取消請求,并在響應(yīng)對象上報告一個身份驗證錯誤:
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()
})
復(fù)制
在
事件:'finish'
在 request 最終的 chunk 數(shù)據(jù)后寫入 request 后觸發(fā)
在
事件: 'abort'
request終止時發(fā)出。abort如果request已經(jīng)關(guān)閉,則不會觸發(fā)該事件。
在
事件: 'error'
返回:
error Error -提供失敗信息的錯誤對象。
當(dāng) net網(wǎng)絡(luò)模塊沒有發(fā)出網(wǎng)絡(luò)請求時會觸發(fā)。 通常情況下,當(dāng) request請求對象發(fā)出一個 error錯誤事件時,一個 close關(guān)閉事件會隨之發(fā)生,并且不會提供響應(yīng)對象。
在
事件: 'close'
作為HTTP 的 request-response 中的最后一個事件發(fā)出。 close事件表明,在request或response 對象中不會發(fā)出更多的事件。
在
事件: 'redirect'
返回:
statusCode 整數(shù)
method 串
redirectUrl 串
responseHeaders 記錄<字符串,字符串[]>
服務(wù)器返回重定向響應(yīng)(例如301永久移動)時發(fā)出。呼叫request.followRedirect將繼續(xù)進行重定向。如果處理了此事件,則request.followRedirect必須同步調(diào)用,否則請求將被取消。
在
實例屬性
在
request.chunkedEncoding
一個Boolean類型的值,指定請求是否將使用 HTTP 分塊傳輸編碼。 默認值為 false. 該屬性是可讀寫的, 但它只能在第一次寫入操作之前設(shè)置,因為還沒有寫入 HTTP 頭。 在第一寫入后如果設(shè)置chunkedEncoding屬性將引發(fā)錯誤。
如果 request 的 body 是一個大的數(shù)據(jù)時,強烈建議使用塊編碼。因為數(shù)據(jù)將以小塊的方式進行傳輸, 而不是在 Electron 進程內(nèi)存中內(nèi)部緩沖。
在
實例方法
在
request.setHeader(name, value)
name String - 額外的 HTTP 頭名稱.
value 字符串-額外的HTTP標(biāo)頭值。
添加一個額外的 HTTP 頭。 The header name will be issued as-is without lowercasing. 它只能在第一次寫入之前調(diào)用。 在第一次寫入后調(diào)用此方法將引發(fā)錯誤。 如果傳遞的值不是 String, 則會調(diào)用 toString () 方法來獲取最終值。
某些標(biāo)頭禁止由應(yīng)用程序設(shè)置。這些標(biāo)題在下面列出。在Chromium的標(biāo)頭utils中可以找到有關(guān)受限標(biāo)頭的更多信息。
Content-Length
Host
Trailer 要么 Te
Upgrade
Cookie2
Keep-Alive
Transfer-Encoding
此外,也不允許將Connection標(biāo)頭設(shè)置為該值upgrade。
在
request.getHeader(name)
name String - 指定一個額外的頭名稱.
返回String-先前設(shè)置的額外標(biāo)題名稱的值。
在
request.removeHeader(name)
name String - 指定一個額外的頭名稱.
刪除先前設(shè)置的額外標(biāo)題名稱。只能在首次寫入之前調(diào)用此方法。首次寫入后嘗試調(diào)用它會引發(fā)錯誤。
在
request.write(chunk[, encoding][, callback])
chunk(字符串|緩沖區(qū))-請求正文的數(shù)據(jù)塊。如果是字符串,則使用指定的編碼將其轉(zhuǎn)換為Buffer。
encoding字符串(可選)-用于將字符串塊轉(zhuǎn)換為Buffer對象。默認為'utf-8'。
callback Function (可選)-在寫操作結(jié)束后調(diào)用。
callback 實質(zhì)上是為了保持與 Node.js API 的相似性而引入的虛擬函數(shù)。 在將 chunk 內(nèi)容傳遞到 Chromium 網(wǎng)絡(luò)層之后, 在下一個 tick 中異步調(diào)用。 與 Node.js 實現(xiàn)相反, 不保證 chunk 內(nèi)容在調(diào)用 callback 之前已經(jīng)被刷新。
向請求正文中添加一個數(shù)據(jù)塊。 第一次寫操作可能導(dǎo)致在線路上發(fā)出請求頭。 在第一次寫入操作后, 不允許添加或刪除自定義標(biāo)頭。
在
request.end([chunk][, encoding][, callback])
chunk (String | Buffer) (可選)
encoding String (可選)
callback Function (可選)
發(fā)送請求數(shù)據(jù)的最后一塊。隨后的寫或結(jié)束操作將被禁止。該finish事件在結(jié)束操作之后發(fā)出。
在
request.abort()
取消正在進行的 HTTP 事務(wù)。 如果請求已發(fā)出 close 事件, 則中止操作將不起作用。 否則正在進行的事件將發(fā)出 abort 和 close 事件。 此外, 如果有一個正在進行的響應(yīng)對象, 它將發(fā)出 aborted 事件。
在
request.followRedirect()
繼續(xù)所有待處理的重定向。只能在'redirect'活動期間調(diào)用。
在
request.getUploadProgress()
返回 Object:
active布爾值-請求當(dāng)前是否處于活動狀態(tài)。如果為false,則不會設(shè)置其他屬性
started布爾值-上傳是否開始。如果這是假的都current和total將被設(shè)置為0。
current 整數(shù)-到目前為止已上傳的字節(jié)數(shù)
total 整數(shù)-此請求將上載的字節(jié)數(shù)
您可以使用此方法獲取使用 POST 請求的文件上傳或其他數(shù)據(jù)傳輸?shù)倪M度
案例
點擊訪問百度
渲染進程
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>網(wǎng)絡(luò)</title>
</head>
<body>
<h1>網(wǎng)絡(luò)</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(`接受到數(shù)據(jù): ${chunk}`)
})
response.on('end', () => {
console.log('數(shù)據(jù)接受完成.')
})
})
//結(jié)束請求
request.end()
}
</script>
</html>
總結(jié)
以上是生活随笔為你收集整理的Electron 网络模块的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel如何制作条形码(EXCEL如何
- 下一篇: 什么是路由?