網絡
使用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()
})
該net
API可以在應用程序發出后才能使用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。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
,error
或manual
. 默認值為follow
. 當模式為error
時, 重定向將被終止. When mode ismanual
the redirection will be cancelled unlessrequest.followRedirect
is invoked synchronously during theredirect
event.
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'
返回:
error
Error -提供失敗信息的錯誤對象。
當 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)
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
事件, 則中止操作將不起作用。 否則正在進行的事件將發出 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>