nativeScript-akylas-https
为 Nativescript 提供带有 SSL 指针的安全 HTTP 客户端 - iOS/Android。
npm i --save nativescript-akylas-https

NativeScript-HTTPS

NPM version Downloads TotalDownloads Twitter Follow

在 Nativescript 中调用基于 HTTP 的 API 的最佳方式。

轻松集成最可靠的本地网络库,同时具有最新和最出色的 HTTPS 安全功能。

插件版本 2.0.0 将 iOS 上的 AFNetworking 升级到 4.0.0,不再依赖于 UIWebView。请确保运行 pod repo update 以在您的开发机器上获取最新的 AFNetworking pod。

默认 http 模块的替代品。

功能

  • 现代 TLS & SSL 安全功能
  • 共享连接池减少请求延迟
  • 自动从常见的连接问题中恢复
  • 所有操作都在本地后台线程上运行
  • 透明的 GZIP
  • 支持 HTTP/2
  • 多部分
  • 缓存
  • 基本 Cookie 支持

常见问题解答

SSL 指针是什么?以及所有这些安全术语是什么意思?

如何通过 SSL 指针使您的应用程序更安全.

我必须使用 SSL 指针吗?

不。 此插件默认情况下即可使用,无需任何安全配置。无论如何,您都将从上述所有功能中受益。

演示

git clone https://github.com/EddyVerbruggen/nativescript-https
cd nativescript-https/src
npm run demo.ios
npm run demo.android

安装

tns-platform-declarations 添加到您的 references.d.ts 中,用于 Android 和 iOS!

/// <reference path="./node_modules/tns-platform-declarations/android.d.ts" />
/// <reference path="./node_modules/tns-platform-declarations/ios.d.ts" />

我们还建议将 "skipLibCheck": true, 添加到您的 tsconfig.json 中。有关更多信息,请参阅此处

安装插件

tns plugin add nativescript-https

示例

使用 GET 方法调用 API

import * as Https from 'nativescript-https'
Https.request({
url: 'https://httpbin.org/get',
method: 'GET',
timeout: 30 // seconds (default 10)
}).then(function(response) {
console.log('Https.request response', response)
}).catch(function(error) {
console.error('Https.request error', error)
})

配置

安装您的 SSL 证书

在您的项目的 app 文件夹中创建一个名为 assets 的文件夹,如下所示 <project>/app/assets。使用 chrome,转到 SSL 证书所在的 URL。查看详细信息,然后将证书图像拖放到 assets 文件夹中。

Installing your SSL certificate

启用 SSL 指针

import { knownFolders } from 'file-system'
import * as Https from 'nativescript-https'
let dir = knownFolders.currentApp().getFolder('assets')
let certificate = dir.getFile('httpbin.org.cer').path
Https.enableSSLPinning({ host: 'httpbin.org', certificate })

一旦您启用了 SSL 指针,您 CAN NOT 使用不同的 hostcertificate 文件重新启用。

禁用 SSL 指针

import * as Https from 'nativescript-https'
Https.disableSSLPinning()

调用此方法后的所有请求将不再使用 SSL 指针,直到再次启用。

useLegacy

有一个名为 useLegacy 的新选项。您可以为每个请求设置选项。使用该选项时,请求的行为将更像 {N} http 模块。

  • 请求返回的 content 不是一个字符串,而是一个对象。它大部分遵循 HTTPContent 格式。您可以调用 toJSONtoFile。唯一的区别是,toFile 返回一个 Promise<File>,这意味着它是异步的,并在后台线程中运行!
  • 错误也返回一个 content,允许您读取其内容。

Cookie

默认情况下,基本 Cookie 支持已启用,以在 {N} http 模块中工作。将来将添加更多选项

启用缓存

import { knownFolders, path } from '@nativescript/core/file-system';
import * as Https from 'nativescript-https'
Https.setCache({
diskLocation: path.join(knownFolders.documents().path, 'httpcache'),
diskSize: 10 * 1024 * 1024 // 10 MiB
});

/// later on when calling your request you can use the cachePolicy option

多部分表单数据

如果将 Content-Type 头设置为 "multipart/form-data",则请求体将被评估为多部分表单数据。每个表单参数都应采用以下格式:

{
data: any
parameterName: string,
fileName?: string
contentType?: string
}

如果设置了 fileNamecontentType,则数据应为 iOS 上的 NSData 或 Android 上的 native.Array<number>

选项

export interface HttpsSSLPinningOptions {
host: string
certificate: string
allowInvalidCertificates?: boolean
validatesDomainName?: boolean
commonName?: string
}
import { HttpRequestOptions } from 'tns-core-modules/http';
export interface HttpsRequestOptions extends HTTPOptions{
useLegacy?: boolean
cachePolicy?: 'noCache' | 'onlyCache' | 'ignoreCache'
onProgress?: (current: number, total: number) => void
}
SSLPinning 选项 描述
host: 字符串 这必须是请求域名,例如 sales.company.org
commonName?: 字符串 默认值:options.host,如果证书 CN 与主机不同,则设置此选项(例如 *.company.org)(Android 特定)
certificate: 字符串 到您的 .cer 证书文件的 URI 路径。
allowInvalidCertificates?: 布尔值 默认值:false。如果使用 SSL pinning,则应始终为 false。如果使用自签名证书,请将其设置为 true
validatesDomainName?: 布尔值 默认值:true。确定是否应使用您的固定证书验证域名。
请求选项 描述
useLegacy?: 布尔值 默认值:false。[仅限 iOS] 将其设置为 true 以直接在 content 中获取响应数据(当状态 >= 300)而不是 response.body.content
`cachePolicy?: 'noCache' 'onlyCache'
onProgress?: (current: number, total: number) => void [仅限 iOS] 设置进度回调。

Webpack / 打包

由于您可能正在将证书与您的应用程序一起分发(如我们的示例所做的那样),请确保它也被 Webpack 打包。您可以通过使用 CopyWebpackPlugin 添加证书()来实现这一点。

iOS 故障排除

在开始 beef 之前,请先了解 iOS 的 App Transport Security

如果您尝试访问未添加到 App Transport Security 的白名单中的 https 路由,则它将不会工作!您可以通过向项目的 Info.plist 中添加以下内容来绕过此行为:

<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

此插件不会自动将 NSAllowsArbitraryLoads 添加到项目的 Info.plist 中。

Android 故障排除

如果您的应用程序崩溃,并且显示它正在主线程上执行过多的网络操作的消息,那么请将选项 allowLargeResponse 的值设置为 true 传递给 request 函数。

感谢

为什么
Robert Laverty 在将其转交给我的帮助下,Robert Laverty 为期很长时间地创建并维护了此插件,他得到了 GetHuman 的 Jeff Whelpley 的帮助。
AFNetworking AFNetworking 一个令人愉悦的 iOS、OS X、watchOS 和 tvOS 网络框架。
Square okhttp 用于 Android 和 Java 应用程序的 HTTP+HTTP/2 客户端。