插件
背景 HTTP
@nativescript/background-http
一个允许您进行后台 HTTP 上传的插件。
内容
安装
npm install @nativescript/background-http
使用 @nativescript/background-http
要进行后台 HTTP 调用,请按照以下步骤操作
- 初始化后台 HTTP 服务
调用 init()
函数以初始化在后台运行的 HTTP 服务。在应用程序的早期,在 main.ts
文件中,应用程序启动之前调用此方法。
import { init } from '@nativescript/background-http'
init()
上传文件
- 通过调用 session() 函数并传递会话的唯一标识符字符串(例如
image-upload
)来创建上传会话。
JavaScript// file path and url var file = '/some/local/file/path/and/file/name.jpg'; var url = 'https://some.remote.service.com/path'; var name = file.substr(file.lastIndexOf('/') + 1); // upload configuration var bghttp = require('@nativescript/background-http'); var session = bghttp.session('image-upload'); var request = { url: url, method: 'POST', headers: { 'Content-Type': 'application/octet-stream', }, description: 'Uploading ' + name, };
- 上传文件
- 要启动简单的上传请求,请调用
session
的uploadFile()
方法,并传递文件路径和 上传请求对象
JavaScriptvar task = session.uploadFile(filePath, request);
- 要启动
multipart/form-data
上传请求或传递其他数据,请调用multipartUpload()
方法。所有参数值必须为字符串
JSvar params = [ { name: 'test', value: 'value' }, { name: 'fileToUpload', filename: file, mimeType: 'image/jpeg' }, ] var task = session.multipartUpload(params, request)
- 通过调用 session() 函数并传递会话的唯一标识符字符串(例如
为了成功上传,您应确保满足以下条件
- 文件必须可从您的应用程序访问。这可能需要其他权限(例如,访问设备上的文档和文件)。
- 操作系统不得阻止 URL。Android Pie 或更高版本的设备默认情况下需要 TLS(HTTPS)连接,并且不会上传到不安全的(HTTP)URL。
处理上传任务事件
uploadFile()
和 multipartUpload()
都会启动并返回一个 Task 实例。
上传任务启动后,您可以使用以下事件监控其进度。
有关事件对象的更多信息,请参阅 任务事件。
task.on("progress", progressHandler);
task.on("error", errorHandler);
task.on("responded", respondedHandler);
task.on("complete", completeHandler);
task.on("cancelled", cancelledHandler); // Android only
每个事件处理程序接收一个包含事件数据的单个参数。
function progressHandler(e: ProgressEventData) {
alert('uploaded ' + e.currentBytes + ' / ' + e.totalBytes)
}
// event arguments:
// task: Task
// responseCode: number
// error: java.lang.Exception (Android) / NSError (iOS)
// response: net.gotev.uploadservice.ServerResponse (Android) / NSHTTPURLResponse (iOS)
function errorHandler(e: ErrorEventData) {
alert('received ' + e.responseCode + ' code.')
var serverResponse = e.response
}
// event arguments:
// task: Task
// responseCode: number
// data: string
function respondedHandler(e: ResultEventData) {
alert('received ' + e.responseCode + ' code. Server sent: ' + e.data)
}
// event arguments:
// task: Task
// responseCode: number
// response: net.gotev.uploadservice.ServerResponse (Android) / NSHTTPURLResponse (iOS)
function completeHandler(e: CompleteEventData) {
alert('received ' + e.responseCode + ' code')
var serverResponse = e.response
}
// event arguments:
// task: Task
function cancelledHandler(e: EventData) {
alert('upload cancelled')
}
API
init()
import { init } from '@nativescript/background-http'
init()
初始化 HTTP 后台服务。
session()
import { session } from '@nativescript/background-http';
session: Session = session(id: string)
按 ID 获取或创建后台下载/上传会话。
会话对象
会话对象具有以下成员
uploadFile(fileUri: string, options: Request): Task
multipartUpload(params: Array<any>, options: Request): Task
这两种方法都启动一个新的后台文件(s)上传任务。uploadFile()
用于单个文件上传,multipartUpload()
用于多个文件上传。fileUri
是要上传的文件的路径。options
参数表示 请求对象。
上传请求对象
请求对象参数具有以下属性
名称 | 类型 | 描述 |
---|---|---|
url | 字符串 | 请求 URL(例如 https://some.remote.service.com/path )。 |
method | 字符串 | 请求方法(例如 POST )。 |
headers | 对象 | 用于指定其他标头。 |
description | 字符串 | 用于帮助在本地识别上传任务 - 不发送到远程服务器。 |
utf8 | 布尔值 | (仅限 Android/仅限 multipart)如果为 true,则将 multipart 请求的字符集设置为 UTF-8。默认为 false。 |
androidNotificationOnProgressTitle | 字符串 | 用于设置 Android 通知中心中显示的进度标题。 |
androidNotificationOnProgressMessage | 字符串 | 用于设置 Android 通知中心中显示的进度消息。 |
androidNotificationOnCompleteTitle | 字符串 | 用于设置 Android 通知中心中显示的完成消息。 |
androidNotificationOnCompleteMessage | 字符串 | 用于设置 Android 通知中心中显示的错误标题。 |
androidNotificationOnErrorTitle | 字符串 | 用于设置 Android 通知中心中显示的错误标题。 |
androidNotificationOnErrorMessage | 字符串 | 用于设置 Android 通知中心中显示的错误消息。 |
androidNotificationOnCancelledTitle | 字符串 | 用于设置 Android 通知中心中显示的已取消标题。 |
androidNotificationOnCancelledMessage | 字符串 | 用于设置 Android 通知中心中显示的已取消消息。 |
androidAutoDeleteAfterUpload | 布尔值 | (仅限 Android)用于设置上传后是否应自动删除文件。 |
androidMaxRetries | 数字 | (仅限 Android)用于设置最大重试次数。默认重试次数为 0。 https://github.com/gotev/android-upload-service/wiki/Recipes#backoff |
androidAutoClearNotification | 布尔值 | (仅限 Android)用于设置上传完成后是否应自动清除通知。默认为 false。请注意,将其设置为 true 也会禁用铃声。 |
androidRingToneEnabled | 布尔值 | (仅限 Android)用于设置上传完成后是否应播放铃声。默认为 true。请注意,当 androidAutoClearNotification 设置为 true 时,此标志无效。 |
androidNotificationChannelID | 字符串 | (仅限 Android)用于设置通知的通道 ID。 |
注意
Android 通知标题/消息可以使用以下占位符之一构建,系统会替换这些占位符
[upload_rate]
:替换为当前上传速率/速度[upload_progress]
:替换为当前上传进度[upload_elapsed_time]
:替换为经过的时间
任务对象
任务对象具有以下属性和方法,可用于获取有关上传的信息
名称 | 类型 | 描述 |
---|---|---|
upload | 数字 | 已上传的字节数。 |
totalUpload | 数字 | 要上传的总字节数。 |
status | 字符串 | 以下之一:error 、uploading 、complete 、pending 、cancelled 。 |
description | 字符串 | 用于创建上传任务的请求中设置的描述。 |
cancel() | void | 调用此方法以取消正在进行的上传。 |
on() | void | 用于添加任务事件处理程序的方法。 |
EventData
名称 | 类型 | 描述 |
---|---|---|
eventName | 字符串 | 事件名称。例如,progress 。 |
对象 | Task | 触发事件的任务。 |
所有任务事件都扩展了 EventData 接口。
ProgressEventData
名称 | 类型 | 描述 |
---|---|---|
currentBytes | 数字 | 迄今为止传输的字节数。 |
totalBytes | 数字 | 预期传输的字节数。 |
ResultEventData
名称 | 类型 | 描述 |
---|---|---|
data | 字符串 | 来自服务器的字符串响应。 |
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
CompleteEventData
名称 | 类型 | 描述 |
---|---|---|
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
response | net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse (iOS) | 来自服务器的响应。 |
ErrorEventData
名称 | 类型 | 描述 |
---|---|---|
error | NSError | java.lang.Exception | 提供底层错误。iOS 为 NSError ,Android 为 java.lang.Exception 。 |
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
response | net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse (iOS) | 来自服务器的响应。 |
API
init()
import { init } from '@nativescript/background-http'
init()
初始化 HTTP 后台服务。
session()
import { session } from '@nativescript/background-http'
session: Session = session(id)
按 ID 获取或创建后台下载/上传会话。
uploadFile()
session.uploadFile(filePath, requestOptions)
session
对象的一种方法,它启动一个后台 任务 以将指定文件编码为 application/x-www-form-urlencoded
进行上传。
参数 | 类型 | 描述 |
---|---|---|
filePath | 字符串 | 要上传的文件的路径。 |
request | 请求 | 提供后台请求的元数据。 |
multipartUpload()
session.multipartUpload()
session
对象的一种方法,它启动一个后台 任务 以将指定文件编码为 multipart/form-data
进行上传。
上传请求对象
请求对象参数具有以下属性
名称 | 类型 | 描述 |
---|---|---|
url | 字符串 | 请求 URL(例如 https://some.remote.service.com/path )。 |
method | 字符串 | 请求方法(例如 POST )。 |
headers | 对象 | 用于指定其他标头。 |
description | 字符串 | 用于帮助在本地识别上传任务 - 不发送到远程服务器。 |
utf8 | 布尔值 | (仅限 Android,仅限 multipartUpload())如果为 true,则将 multipart 请求的字符集设置为 UTF-8。默认为 false 。 |
androidNotificationOnProgressTitle | 字符串 | 用于设置 Android 通知中心中显示的进度标题。 |
androidNotificationOnProgressMessage | 字符串 | 用于设置 Android 通知中心中显示的进度消息。 |
androidNotificationOnCompleteTitle | 字符串 | 用于设置 Android 通知中心中显示的完成消息。 |
androidNotificationOnCompleteMessage | 字符串 | 用于设置 Android 通知中心中显示的完成消息。 |
androidNotificationOnErrorTitle | 字符串 | 用于设置 Android 通知中心中显示的错误标题。 |
androidNotificationOnErrorMessage | 字符串 | 用于设置 Android 通知中心中显示的错误消息。 |
androidNotificationOnCancelledTitle | 字符串 | 用于设置 Android 通知中心中显示的已取消标题。 |
androidNotificationOnCancelledMessage | 字符串 | 用于设置 Android 通知中心中显示的已取消消息。 |
androidAutoDeleteAfterUpload | 布尔值 | (仅限 Android)用于设置上传后是否应自动删除文件。 |
androidMaxRetries | 数字 | (仅限 Android)用于设置最大重试次数。默认重试次数为 0。 https://github.com/gotev/android-upload-service/wiki/Recipes#backoff |
androidAutoClearNotification | 布尔值 | (仅限 Android)用于设置上传完成后是否应自动清除通知。默认为 false。请注意,将其设置为 true 也会禁用铃声。 |
androidRingToneEnabled | 布尔值 | (仅限 Android)用于设置上传完成后是否应播放铃声。默认为 true。请注意,当 androidAutoClearNotification 设置为 true 时,此标志无效。 |
androidNotificationChannelID | 字符串 | (仅限 Android)用于设置通知的通道 ID。 |
注意
Android 通知标题/消息可以使用以下占位符之一构建,系统会替换这些占位符
[upload_rate]
:替换为当前上传速率/速度[upload_progress]
:替换为当前上传进度[upload_elapsed_time]
:替换为经过的时间
任务对象
任务对象具有以下属性和方法。
名称 | 类型 | 描述 |
---|---|---|
upload | 数字 | 已上传的字节数。 |
totalUpload | 数字 | 要上传的总字节数。 |
status | 字符串 | 以下之一:error 、uploading 、complete 、pending 、cancelled 。 |
description | 字符串 | 用于创建上传任务的请求中设置的描述。 |
cancel() | void | 调用此方法以取消正在进行的上传。 |
on() | void | 用于添加任务事件处理程序的方法。 |
任务事件
以下是为后台任务的不同进度状态发出的事件
- 事件数据
名称 | 类型 | 描述 |
---|---|---|
eventName | 字符串 | 事件名称。例如,progress 。 |
对象 | Task | 触发事件的任务。 |
以下所有任务事件都扩展了前面的EventData接口。
- ProgressEventData
名称 | 类型 | 描述 |
---|---|---|
currentBytes | 数字 | 迄今为止传输的字节数。 |
totalBytes | 数字 | 预期传输的字节数。 |
- ResultEventData
名称 | 类型 | 描述 |
---|---|---|
data | 字符串 | 来自服务器的字符串响应。 |
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
- CompleteEventData
名称 | 类型 | 描述 |
---|---|---|
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
response | net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse (iOS) | 来自服务器的响应。 |
- ErrorEventData
名称 | 类型 | 描述 |
---|---|---|
error | NSError | java.lang.Exception | 提供底层错误。iOS 为 NSError ,Android 为 java.lang.Exception 。 |
responseCode | 数字 | 如果存在响应对象,则为 HTTP 响应代码。否则为 -1 。 |
response | net.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse (iOS) | 来自服务器的响应。 |
在本地测试插件
要测试插件,您必须拥有一个服务器实例来接收上传。有一些在线服务可用于小型文件上传 - 例如 http://httpbin.org/post
但是,这些服务不能用于大型文件。插件存储库附带了一个简单的服务器,您可以在本地运行它。以下是启动它的方法
cd demo-server
npm i
node server 8080
以上命令将启动一个在端口 8080 上侦听的服务器。请记住更新应用程序中的 URL 以匹配服务器运行的地址/端口。
注意
如果您使用的是 iOS 模拟器,则应使用 http://localhost:8080
上传到演示服务器。如果您使用的是 Android 模拟器,则应使用 http://10.0.2.2:8080
。
许可证
Apache 许可证版本 2.0