8.7 版本发布—WinterCG 兼容性第一部分
了解更多

在 GitHub 上查看

@nativescript/background-http

一个允许您进行后台 HTTP 上传的插件。

内容

安装

cli
npm install @nativescript/background-http

使用 @nativescript/background-http

要进行后台 HTTP 调用,请按照以下步骤操作

  1. 初始化后台 HTTP 服务

调用 init() 函数以初始化在后台运行的 HTTP 服务。在应用程序的早期,在 main.ts 文件中,应用程序启动之前调用此方法。

TypeScript
import { init } from '@nativescript/background-http'
init()
  1. 上传文件

    1. 通过调用 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,
    };
    1. 上传文件
    • 要启动简单的上传请求,请调用 sessionuploadFile() 方法,并传递文件路径和 上传请求对象
    JavaScript
    var task = session.uploadFile(filePath, request);
    • 要启动 multipart/form-data 上传请求或传递其他数据,请调用 multipartUpload() 方法。所有参数值必须为字符串
    JS
    var params = [
      { name: 'test', value: 'value' },
      { name: 'fileToUpload', filename: file, mimeType: 'image/jpeg' },
    ]
    
    var task = session.multipartUpload(params, request)

为了成功上传,您应确保满足以下条件

  • 文件必须可从您的应用程序访问。这可能需要其他权限(例如,访问设备上的文档和文件)。
  • 操作系统不得阻止 URL。Android Pie 或更高版本的设备默认情况下需要 TLS(HTTPS)连接,并且不会上传到不安全的(HTTP)URL。

处理上传任务事件

uploadFile()multipartUpload() 都会启动并返回一个 Task 实例。

上传任务启动后,您可以使用以下事件监控其进度。

有关事件对象的更多信息,请参阅 任务事件

JavaScript
task.on("progress", progressHandler);
task.on("error", errorHandler);
task.on("responded", respondedHandler);
task.on("complete", completeHandler);
task.on("cancelled", cancelledHandler); // Android only

每个事件处理程序接收一个包含事件数据的单个参数。

TS
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()

TS
import { init } from '@nativescript/background-http'

init()

初始化 HTTP 后台服务。


session()

TS
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字符串以下之一:erroruploadingcompletependingcancelled
description字符串用于创建上传任务的请求中设置的描述。
cancel()void调用此方法以取消正在进行的上传。
on()void用于添加任务事件处理程序的方法。

EventData

名称类型描述
eventName字符串事件名称。例如,progress
对象Task触发事件的任务。

所有任务事件都扩展了 EventData 接口。

ProgressEventData

名称类型描述
currentBytes数字迄今为止传输的字节数。
totalBytes数字预期传输的字节数。

ResultEventData

名称类型描述
data字符串来自服务器的字符串响应。
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1

CompleteEventData

名称类型描述
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1
responsenet.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS)来自服务器的响应。

ErrorEventData

名称类型描述
errorNSError | java.lang.Exception提供底层错误。iOS 为 NSError,Android 为 java.lang.Exception
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1
responsenet.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS)来自服务器的响应。

API

init()

TS
import { init } from '@nativescript/background-http'

init()

初始化 HTTP 后台服务。


session()

TS
import { session } from '@nativescript/background-http'

session: Session = session(id)

按 ID 获取或创建后台下载/上传会话。


uploadFile()

TS
session.uploadFile(filePath, requestOptions)

session 对象的一种方法,它启动一个后台 任务 以将指定文件编码为 application/x-www-form-urlencoded 进行上传。

参数类型描述
filePath字符串要上传的文件的路径。
request请求提供后台请求的元数据。

multipartUpload()

TS
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字符串以下之一:erroruploadingcompletependingcancelled
description字符串用于创建上传任务的请求中设置的描述。
cancel()void调用此方法以取消正在进行的上传。
on()void用于添加任务事件处理程序的方法。

任务事件

以下是为后台任务的不同进度状态发出的事件

  • 事件数据
名称类型描述
eventName字符串事件名称。例如,progress
对象Task触发事件的任务。

以下所有任务事件都扩展了前面的EventData接口。

  • ProgressEventData
名称类型描述
currentBytes数字迄今为止传输的字节数。
totalBytes数字预期传输的字节数。
  • ResultEventData
名称类型描述
data字符串来自服务器的字符串响应。
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1
  • CompleteEventData
名称类型描述
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1
responsenet.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS)来自服务器的响应。
  • ErrorEventData
名称类型描述
errorNSError | java.lang.Exception提供底层错误。iOS 为 NSError,Android 为 java.lang.Exception
responseCode数字如果存在响应对象,则为 HTTP 响应代码。否则为 -1
responsenet.gotev.uploadservice.ServerResponse (Android) | NSHTTPURLResponse(iOS)来自服务器的响应。

在本地测试插件

要测试插件,您必须拥有一个服务器实例来接收上传。有一些在线服务可用于小型文件上传 - 例如 http://httpbin.org/post 但是,这些服务不能用于大型文件。插件存储库附带了一个简单的服务器,您可以在本地运行它。以下是启动它的方法

cli
cd demo-server
npm i
node server 8080

以上命令将启动一个在端口 8080 上侦听的服务器。请记住更新应用程序中的 URL 以匹配服务器运行的地址/端口。

注意

如果您使用的是 iOS 模拟器,则应使用 http://localhost:8080 上传到演示服务器。如果您使用的是 Android 模拟器,则应使用 http://10.0.2.2:8080

许可证

Apache 许可证版本 2.0