本文介绍:协议的注册和处理
注册自定义协议并拦截现有协议请求
进程: 主进程
实现类似 file:// 协议的小例子 :
const {app, protocol} = require('electron')
const path = require('path')
app.on('ready', () => {
protocol.registerFileProtocol('atom', (request, callback) => {
const url = request.url.substr(7)
callback({path: path.normalize(`${__dirname}/${url}`)})
}, (error) => {
if (error) console.error('无法注册协议')
})
})
注意: 这个模块方法应用于 app 模块的 ready 事件之后
方法
protocol.registerStandardSchemes(schemes[, options])
用途:注册名为
schemes的标准协议
schemesString[] - 要注册为标准协议的自定义协议名.optionsObject (可选)secureBoolean (可选) - 是否使用安全协议,默认为false.
标准协议必须遵循RFC 3986调用通用URI语法。例如http和https是标准协议,而file不是。
注册标准协议后,在服务时可正确相关资源。否则行为类似file,但无法解析URL。例如,下文无法加载图像test.png,,因为非标准协议无法识别相对URL:
<body>
<img src='test.png'>
</body>
注册为标准协议后,允许通过系统文件API访问文件。否则渲染器会抛出安全错误。
默认情况下,非标准协议禁用所有Web存储 API(localStorage,sessionStorage,webSQL,indexedDB,cookies)。
所以一般来说,如果你想注册一个自定义协议来代替http协议,你必须将它注册成标准协议:
const {app, protocol} = require('electron')
protocol.registerStandardSchemes(['atom'])
app.on('ready', () => {
protocol.registerHttpProtocol('atom', '...')
})
注意: 以上方法必须在 app 模块的 ready 事件之前使用
protocol.registerServiceWorkerSchemes(schemes)
用途:注册名为
schemes的service workers自定义协议
schemesString[] - 要注册为service workers自定义协议的自定义协议名.
service worker是运行于浏览器后台的一种脚本,它可以无需Web页面或者用户交互就能提供额外的功能.通常用在离线开发上.
举个例子:比如断网了,你仍然可以使用本地缓存数据.
protocol.registerFileProtocol(scheme, handler[, completion])
用途:注册名为
schemes的将发送文件作为响应的自定义协议
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctionfilePathString (可选)
completionFunction (可选)errorError
当使用 scheme创建一个 request时, handler将被 handler(request,callback)调用。
当 scheme 被成功注册或者完成(错误)时失败, completion(error)会使用 completion(null)来调用 completion。
要处理 request, callback应该用文件的路径或一个具有 path属性的对象来调用,例如: callback(filePath) 或 callback({path:filePath})。
如果 callback为空或一个数字或存在error属性的对象, request 都将失败并显示为你指定的错误号,详见错误号列表
默认情况下, scheme类似于 http:,它的解析方式不同于如 file:之类的 通用URI语法( generic URI syntax )协议.所以你或许应该调用 protocol.registerStandardSchemes 来创建一个标准协议。
protocol.registerBufferProtocol(scheme, handler[, completion])
用途:注册名为
schemes的将发送Buffer作为响应的自定义协议
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctionbuffer(Buffer | MimeTypedBuffer) (可选)
completionFunction (可选)errorError
用法类似 registerFileProtocol,除了 callback应该用具有 data, mimeType和 charset属性的 Buffer对象来调用.
const {protocol} = require('electron')
protocol.registerBufferProtocol('atom', (request, callback) => {
callback({mimeType: 'text/html', data: new Buffer('<h5>回调响应</h5>')})
}, (error) => {
if (error) console.error('无法注册协议')
})
protocol.registerStringProtocol(scheme, handler[, completion])
用途:注册名为
schemes的将发送String作为响应的自定义协议
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctiondataString (可选)
completionFunction (可选)errorError
用法类似 registerFileProtocol,除了 callback应该用 String 或一个 data, mimeType和 charset属性的对象来调用.
protocol.registerHttpProtocol(scheme, handler[, completion])
用途:注册名为
schemes的将发送HTTP请求作为响应的自定义协议
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctionredirectRequestObjecturlStringmethodStringsessionObject (可选)uploadDataObject (可选)contentTypeString - 内容的MIME类型dataString -要发送的内容
completionFunction (可选)errorError
注册一个 scheme 协议,用来发送 HTTP 请求作为响应.
用法类似 registerFileProtocol,除了 callback应该用具有 url, method, referrer, uploadData 和 session 属性的 redirectRequest对象来调用.
HTTP 请求默认使用当前 session .如果你想使用不同的session值,你应该设置 session 为 null.
对于POST 请求,必须提供 uploadData 对象.
protocol.unregisterProtocol(scheme[, completion])
用途:注销名为
scheme的自定义协议
schemeStringcompletionFunction (可选)errorError
protocol.isProtocolHandled(scheme, callback)
用途:判断是否已有一个处理
scheme协议的程序(Boolean)
schemeStringcallbackFunctionerrorError
protocol.interceptFileProtocol(scheme, handler[, completion])
用途:拦截
scheme协议并使用handler(发送一个文件作为响应)作为协议的新处理程序
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctionfilePathString
completionFunction (可选)errorError
protocol.interceptStringProtocol(scheme, handler[, completion])
用途:拦截
scheme协议并使用handler(发送一个String作为响应)作为协议的新处理程序
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctiondataString (可选)
completionFunction (可选)errorError
protocol.interceptBufferProtocol(scheme, handler[, completion])
用途:拦截
scheme协议并使用handler(发送一个Buffer作为响应)作为协议的新处理程序
schemeStringhandlerFunctionrequestObjecturlStringreferrerStringmethodStringuploadDataUploadData[]
callbackFunctionbufferBuffer (可选)
completionFunction (可选)errorError
protocol.interceptHttpProtocol(scheme, handler[, completion])
用途:拦截
scheme协议并使用handler(发送一个HTTP请求作为响应)作为协议的新处理程序
schemeStringhandlerFunction
requestObject
urlStringreferrerStringmethodStringuploadDataUploadData[]callbackFunction
redirectRequestObject
urlStringmethodStringsessionObject (可选)uploadDataObject (可选)
contentTypeString - 内容的MIME类型dataString -要发送的内容completionFunction (可选)
errorError
protocol.uninterceptProtocol(scheme[, completion])
用途:删除为
scheme协议安装的拦截器并恢复其原始处理程序
schemeStringcompletionFunction (可选)errorError