网络
使用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>