HarmonyOS 鸿蒙学习笔记2-网络哀求、端云一体化
一、网络哀求1、HTTP数据哀求
应用通过`HTTP`发起一个数据哀求,支持常见的`GET`、`POST`、`OPTIONS`、`HEAD`、`PUT`、`DELETE`、`TRACE`、`CONNECT`方式。
束缚与限制
利用网络管理模块的相干功能时,必要哀求相应的权限。
| 权限名 | 阐明 |
| ------ | ------ |
| ohos.permission.GET_NETWORK_INFO | 获取网络毗连信息。 |
| ohos.permission.SET_NETWORK_INFO | 修改网络毗连状态。 |
| ohos.permission.INTERNET | 允许程序打开网络套接字,进行网络毗连。 |
利用`Stage`模型的应用,在`module.json5`配置文件中声明权限:
```js
{
"module" : {
// ...
"requestPermissions":[
{
"name" : "ohos.permission.INTERNET",
"reason": "描述申请权限的原因"
}
]
}
} ```
[权限详细属性配置](https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/accesstoken-guidelines-0000001493744016-V3)
http模块
`HTTP`数据哀求功能告急由`http`模块提供,涉及的接口如下表,具体的接口阐明参考(https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-http-0000001478061929-V3)。
| 接口名 | 功能描述 |
| ------ | ------ |
| createHttp() | 创建一个http哀求。 |
| request() | 根据URL所在,发起HTTP网络哀求。 |
| destroy() | 中断哀求任务。 |
| on(type: 'headersReceive') | 订阅HTTP Response Header 事件。 |
| off(type: 'headersReceive') | 取消订阅HTTP Response Header 事件。 |
| once(type: 'headersReceive') | 订阅HTTP Response Header 事件,但是只触发一次。 |
request接口开辟步调
1. 从`@ohos.net.http`中导入`http`模块。
2. 调用`createHttp()`方法,创建一个`HttpRequest`对象。
3. 调用该对象的`on()`方法,订阅`http`响应头事件,此接口会比`request`哀求先返回。可以根据业务必要订阅此消息。
4. 调用该对象的`request()`方法,传入`http`哀求的`url`所在和可选参数,发起网络哀求。
5. 按照实际业务必要,解析返回结果。
6. 调用该对象的`off()`方法,取消订阅`http`响应头事件。
7. 当该哀求利用完毕时,调用`destroy()`方法自动烧毁。
```js
// 引入包名
import http from '@ohos.net.http';
// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
"EXAMPLE_URL",
{
method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
// 开发者根据自身业务需要添加header字段
header: {
'Content-Type': 'application/json'
},
// 当使用POST请求时此字段用于传递内容
extraData: {
"data": "data to send",
},
expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
usingCache: true, // 可选,默认为true
priority: 1, // 可选,默认为1
connectTimeout: 60000, // 可选,默认为60000ms
readTimeout: 60000, // 可选,默认为60000ms
usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
}, (err, data) => {
if (!err) {
// data.result为HTTP响应内容,可根据业务需要进行解析
console.info('Result:' + JSON.stringify(data.result));
console.info('code:' + JSON.stringify(data.responseCode));
// data.header为HTTP响应头,可根据业务需要进行解析
console.info('header:' + JSON.stringify(data.header));
console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
} else {
console.info('error:' + JSON.stringify(err));
// 取消订阅HTTP响应头事件
httpRequest.off('headersReceive');
// 当该请求使用完毕时,调用destroy方法主动销毁
httpRequest.destroy();
}
}
); ```
2、应用文件的上传和下载
用户文件的上传和下载
> 在开辟过程中,避免不了要去上传下载一些文件,如上传头像、生存图片、生存音频等。
上传
起首用户必要选择文件,这里必要用到`@ohos.file.picker`模块,选择之后会得到一个`uri`本地文件所在,以图片选择为例:
```js
import picker from '@ohos.file.picker';
@Entry
@Component
struct Picker {
@State url:string=""
build() {
Row() {
Column() {
if(this.url){
Image(this.url)
.width("100%")
}
Text("选择图片")
.textAlign(TextAlign.Center)
.lineHeight(80)
.onClick(async()=>{
// 创建picker实例
let photoPicker = new picker.PhotoViewPicker();
// 通过选择模式拉起photoPicker界面,用户可以选择一个或多个图片/视频。
let result = await photoPicker.select()
// photoUris为选择的图片uri集合
this.url = result.photoUris
})
}
.width('100%')
}
.height('100%')
}
} ```
执行上传利用:
```js
import picker from '@ohos.file.picker';
import request from '@ohos.request';
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
@Entry
@Component
struct Picker {
@State url:string="";
private context = getContext(this) as common.UIAbilityContext;
build() {
Row() {
Column() {
if(this.url){
Image(this.url)
.width("100%")
}
Text("选择图片")
.textAlign(TextAlign.Center)
.lineHeight(80)
.onClick(async()=>{
// 创建picker实例
let photoPicker = new picker.PhotoViewPicker();
// 通过选择模式拉起photoPicker界面,用户可以选择一个或多个图片/视频。
let result = await photoPicker.select()
// photoUris为选择的图片uri集合
this.url = result.photoUris;
// 将文件拷贝至cache目录,目前request.uploadFile只能上传cache目录下的文件 需要用到fs模块
let cacheDir = this.context.cacheDir;//获取缓存目录平台绝对路径
let imgName = this.url.split('/').pop()+".jpg";
let dstPath = cacheDir + '/' + imgName;//目标地址
let srcFile = fs.openSync(this.url);//选择的文件
let dstFile = fs.openSync(dstPath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);//目标文件
fs.copyFileSync(srcFile.fd, dstFile.fd);//拷贝
fs.closeSync(srcFile);//关闭文件访问
fs.closeSync(dstFile);//关闭文件访问
// 上传请求配置信息
let uploadConfig = {
url: 'http://xxx.com/upload_file', //需要手动替换为真实服务器地址
method: "POST",
// name为上传文件的参数名
files: [{ filename: imgName, name: "file", uri: 'internal://cache/' + imgName, type: "jpg" }],
header:{},
// 携带额外字段
data:[
// { name: 'name', value: 'value' }
]
};
try{
let uploadTask = await request.uploadFile(this.context,uploadConfig);
uploadTask.on('complete', (taskStates) => {
// 上传完毕,不会返回响应结果,可以生成唯一标识,后端提供接口 获取上传地址
console.info(`----upload complete taskState: ${JSON.stringify(taskStates)}`);
// 删除拷贝的文件
fs.unlink(dstPath)
});
}
catch(err){
console.log(JSON.stringify(err),"--------------------")
}
})
}
.width('100%')
}
.height('100%')
}
} ```
下载
```js
import common from '@ohos.app.ability.common';
import fs from '@ohos.file.fs';
import request from '@ohos.request';
// 获取应用文件路径
let context = getContext(this) as common.UIAbilityContext;
let filesDir = context.filesDir;
request.downloadFile(context, {
url: 'http://www.mobiletrain.org/images/index/new_logo.png',//资源在线地址
filePath: filesDir + '/new_logo.png'//本地存储地址
}).then((downloadTask) => {
console.log("----------------------------------")
downloadTask.on('complete', () => {
// 需要拼接"file://"前缀 才能在页面中访问
this.url = "file://"+filesDir + '/new_logo.png'
console.log("下载完毕",this.url)
})
}).catch((err) => {
console.log(`下载失败, code: ${err.code}, message: ${err.message}`);
}); ```
3、利用Axios
Axios
> `Axios` ,是一个基于 `promise` 的网络哀求库,可以运行 `node.js` 和浏览器中。本库基于`Axios` 原库`v1.3.4`版本进行适配,使其可以运行在 `OpenHarmony`,并相沿其现有用法和特性。
- `http` 哀求
- `Promise API`
- `request` 和 `response` 拦截器
- 转换 `request `和 `response` 的 `data` 数据
- 自动转换 `JSON data` 数据
下载安装
```
ohpm install @ohos/axios
```
接口和属性列表
| 接口 | 参数 | 功能 |
| ------ | ------ | ------ |
| axios(config) | config:哀求配置 | 发送哀求 |
| axios.create(config) | config:哀求配置 | 创建实例 |
| axios.request(config) | config:哀求配置 | 发送哀求 |
| axios.get(url[, config]) | url:哀求所在<br/>config:哀求配置 | 发送get哀求 |
| axios.delete(url[, config]) | url:哀求所在<br/>config:哀求配置 | 发送delete哀求 |
| axios.post(url[, config]) | url:哀求所在<br/>data:发送哀求体数据<br/>config:哀求配置 | 发送post哀求 |
| axios.put(config) | url:哀求所在<br/>data:发送哀求体数据<br/>config:哀求配置 | 发送put哀求 |
| 属性 | 描述 |
| ------ | ------ |
| axios.defaults['xxx'] | 默认设置值,为哀求配置 config 中的配置项</br>例如 axios.defaults.headers 获取头部信息 |
| axios.interceptors | 拦截器 |
哀求配置
上传和下载和web端的axios有些差异,其他根本同等。
```js
{
// `url` 是用于请求的服务器 URL
url: '/user',
// `method` 是创建请求时使用的方法 支持post/get/put/delete方法,不区分大小写,默认为get方法
method: 'get', // default
// `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
// 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
baseURL: 'https://www.xxx.com/info',
// `transformRequest` 允许在向服务器发送前,修改请求数据
// 它只能用于 'PUT', 'POST' 和 'PATCH' 这几个请求方法
// 数组中最后一个函数必须返回一个字符串, 一个Buffer实例,ArrayBuffer,FormData,或 Stream
// 你可以修改请求头。
transformRequest: [function (data, headers) {
// 对发送的 data 进行任意转换处理
return data;
}],
// `transformResponse` 在传递给 then/catch 前,允许修改响应数据
transformResponse: [function (data) {
// 对接收的 data 进行任意转换处理
return data;
}],
// `headers` 是即将被发送的自定义请求头
headers: {'Content-Type': 'application/json'},
// `params` 是即将与请求一起发送的 URL 参数
// 必须是一个无格式对象(plain object),其他对象如 URLSearchParams ,必须使用 paramsSerializer 进行序列化
params: {
ID: 12345
},
// `paramsSerializer` 是一个负责 `params` 序列化的函数
paramsSerializer: function(params) {
return params
},
// `data` 是作为请求主体被发送的数据
// 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
// 在没有设置 `transformRequest` 时,必须是以下类型之一,其他类型使用 transformRequest 转换处理
// - string, plain object, ArrayBuffer
data: {
firstName: 'Fred'
},
// 发送请求体数据的可选语法
// 请求方式 post
// 只有 value 会被发送,key 则不会
data: 'Country=Brasil&City=Belo Horizonte',
// `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
// 如果请求超过 `timeout` 的时间,请求将被中断
timeout: 1000,
// `adapter` 允许自定义处理请求,这使测试更加容易。
// 返回一个 promise 并提供一个有效的响应 (参见 lib/adapters/README.md)。
adapter: function (config) {
/* ... */
},
// 如果设置了此参数,系统将使用用户指定路径的CA证书,(开发者需保证该路径下CA证书的可访问性),否则将使用系统预设CA证书,系统预设CA证书位置:/etc/ssl/certs/cacert.pem。证书路径为沙箱映射路径(开发者可通过Global.getContext().filesDir获取应用沙箱路径)。目前仅支持后缀名为.pem的文本格式证书。
caPath: '',
// 优先级,范围,默认是1,值越大,优先级越高;
priority: 1,
// `responseType` 指定返回数据的类型,默认无此字段。如果设置了此参数,系统将优先返回指定的类型。
// 选项包括: string:字符串类型; object:对象类型; array_buffer:二进制数组类型。
responseType: 'string',
// `onUploadProgress` 允许为上传处理进度事件,上传文件必须设置该事件
onUploadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
// `onDownloadProgress` 允许为下载处理进度事件,下载文件必须设置该事件
onDownloadProgress: function (progressEvent) {
// 对原生进度事件的处理
},
// 基于应用程序的上下文,只适用于上传/下载请求
context: context,
// 下载路径。此参数,只适用于下载请求,
// Stage模型下使用AbilityContext 类获取文件路径,比如:'${getContext(this).cacheDir}/test.txt’并将文件存储在此路径下
filePath: context,
} ```
利用示例
```js
import axios from '@ohos/axios'
axios.get("http://xxxx").then(({data})=>{
console.log(data)
}) ```
上传文件
```js
import axios from '@ohos/axios'
import { FormData } from '@ohos/axios'
let formData = new FormData()
formData.append('file', 'internal://cache/blue.jpg')
// 发送请求
axios.post('https://www.xxx.com/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
context: getContext(this),
onUploadProgress: (progressEvent) => {
console.info(progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) + '%' : '0%');
},
}).then((res) => {
console.info("result" + JSON.stringify(res.data));
}).catch((err) => {
console.error("error:" + JSON.stringify(err));
}) ```
下载文件
设置下载路径`filePath`(默认在'`internal://cache/`'路径下)。
关于`filePath`:
- filePath:'workspace/test.txt':默认路径下创建workspace路径,并将文件存储在workspace路径下。
- filePath:'test.txt':将文件存储在默认路径下。
- filePath:'workspace/':默认路径下创建workspace路径,并将文件存储在workspace路径下。
```js
let filePath = getContext(this).cacheDir + '/blue.jpg'
// 下载。如果文件已存在,则先删除文件。
try {
fs.accessSync(filePath);
fs.unlinkSync(filePath);
} catch(err) {}
axios({
url: 'https://www.xxx.com/blue.jpg',
method: 'get',
context: getContext(this),
filePath: filePath ,
onDownloadProgress: (progressEvent): void => {
console.info("progress: " + progressEvent && progressEvent.loaded && progressEvent.total ? Math.ceil(progressEvent.loaded / progressEvent.total * 100) : 0)
}
}).then((res)=>{
console.info("result: " + JSON.stringify(res.data));
}).catch((error)=>{
console.error("error:" + JSON.stringify(error));
}) ```
二、端云一体化
1、端云项目搭建
> 为丰富HarmonyOS对云端开辟的支持、实现端云联动,DevEco Studio推出了云开辟功能,开辟者在创建工程时选择云开辟模板,即可在DevEco Studio内同时完成HarmonyOS应用/元服务的端侧与云侧开辟,体验端云一体化协同开辟。
https://img-blog.csdnimg.cn/direct/f14a3a33ded4418d9bd81366004bc9f3.jpeg
相比于传统开辟模式,云开辟模式具备本钱低、效率高、门槛低等上风:
| 区别点 | 传统开辟模式 | 云开辟模式
| 开辟工具 | 端侧与云侧各需一套开辟工具,云侧需自建服务器,工具本钱高。 |
| DevEco Studio一套开辟工具即可支撑端侧与云侧同时开辟,无需搭建服务器,工具本钱低。 |
| 开辟人员 | 端侧与云侧要求不同的开辟语言,技能要求高。需多人投入,且开辟人员之间需连续、正确沟通,人力与沟通本钱高、效率低。 | 依托AppGallery Connect(以下简称AGC)Serverless云服务开放的接口,端侧开辟人员也能轻松开辟云侧代码,大大低落开辟门槛。开辟人员数量少,低落人力本钱,进步沟通效率。 |
| 运维 | 需自行构建运营与运维能力,本钱高、负担重。|
| 直接接入AGC Serverless云服务,实现免运维,无运维本钱或资源浪费。 |
https://img-blog.csdnimg.cn/direct/31cca938821340d3b7769d34e769d222.jpeg
搭建项目
1.登录
(https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/) 创建应用
点击我的项目,在项目页面中添加项目
https://img-blog.csdnimg.cn/direct/9c95ce075aa14108a734317109c426f4.png
若项目中没有应用,在“项目设置”页面中添加应用
https://img-blog.csdnimg.cn/direct/7c1fbf4ba36d475c9223b680125b8e26.png
在“添加应用”页面中设置基础信息
https://img-blog.csdnimg.cn/direct/93a41ed979eb4ab9b8b4dac18e88b906.png
开通必要利用的serverless服务
https://img-blog.csdnimg.cn/direct/3cbfae6c0c904c09a4aa18745f69b32c.png
https://img-blog.csdnimg.cn/direct/67967749ae014d42bcea979179361749.png
https://img-blog.csdnimg.cn/direct/9f722981778a48f6a27cee1fc8ab5934.png
2.进入开辟者工具 创建端云项目
开辟者工具登录华为账号
https://img-blog.csdnimg.cn/direct/f8836e64982c4a919802a84d888710bf.png
选择云开辟基础模板
https://img-blog.csdnimg.cn/direct/24d952e511c84c958c94189a869854c6.png
关联应用
https://img-blog.csdnimg.cn/direct/15ade2188e6643f59e78b1d9e9c5fca0.png
项目结构
端云一体化开辟工程目录分为三个子工程:端开辟工程(Application)、云开辟工程(CloudProgram)、端侧公共库(External Libraries)
https://img-blog.csdnimg.cn/direct/46cbf4b2c725461183047792cec655af.png
云开辟工程(CloudProgram)
https://img-blog.csdnimg.cn/direct/745a4bcc252244a9a15a402f17336721.png
3.部署云开辟工程
在云开辟工程目录上右键,点击Deploy Cloud Program
https://img-blog.csdnimg.cn/direct/98286d8d74a04a168deee4b241415888.png
部署完成即可体验云开辟基础模板
https://img-blog.csdnimg.cn/direct/9b2cc5ff9ef544849d50f05e41680735.png
2、云函数
云函数开辟
> 云函数负担传统应用后端接口的职责,在云函数内部编写业务逻辑,执行数据库访问、第三方Api调用等利用,开辟者可以在云侧工程下开辟云函数资源,包括创建函数、调试函数、部署函数。
https://img-blog.csdnimg.cn/direct/eb366cdea49f45f3831f1616041875d4.png
1.创建函数
右击“cloudfunctions”目录,选择“New > Cloud Function”
https://img-blog.csdnimg.cn/direct/c8cc47dd0d2a4b89a9792aa27f96d8fe.png
输入函数名称后,点击“OK”,函数名称仅支持小写英文字母、数字、中划线(-),首字符必须为小写字母,结尾不能为中划线(-)。
2.调试函数
函数开辟过程中,可在本地进行调试,也可以将函数部署到AGC云端后,在本地触发调用云端函数。
右击“cloudfunctions”目录,选择“Run Cloud Functions”。
https://img-blog.csdnimg.cn/direct/c8a68387a0d94976a4a6e88b4f443b84.png
检察“Run”面板。如果出现“Cloud Functions loaded successfully”,表现所有函数已成功加载到本地运行的HTTP Server中,并生成对应的POST URL。
https://img-blog.csdnimg.cn/direct/ed239309077b4c8a84c3add22701dd73.png
在菜单栏选择“Tools > CloudDev > Cloud Functions Requestor”,利用Cloud Functions Requestor触发函数调用。
https://img-blog.csdnimg.cn/direct/3862560a51d4444aabdd195071e1f9bb.png
在弹出的“Cloud Functions Requestor”面板,填写触发事件参数。
https://img-blog.csdnimg.cn/direct/8348cf5559a14576836e99b8adba9865.png
3.部署函数
完成函数代码开辟后,您可将函数部署到AGC控制台,支持单个部署和批量部署。
单个部署
右击需部署的函数量录,选择“Deploy Function”。
https://img-blog.csdnimg.cn/direct/1cfe8de784c848aebc2506bd1e3e57fd.png
“底部状态栏右侧将展示函数打包与部署进度。
耐心等候,直至出现“Deploy successfully”消息,表现函数已成功部署。
https://img-blog.csdnimg.cn/direct/4a678bcf4d3e451b8a584fb0739265e8.png
登录(https://developer.huawei.com/consumer/cn/service/josp/agc/index.html),进入当前项目的云函数服务菜单,可检察到您刚刚部署的函数,函数名称与本地工程的函数量录名相同。
https://img-blog.csdnimg.cn/direct/f6d76578ea6940b5b846101a3f5153f8.png
批量部署指将整个云函数量录下创建的所有函数同时部署到AGC控制台。
右击“cloudfunctions”目录,选择“Deploy Cloud Functions”。
https://img-blog.csdnimg.cn/direct/e9f3b788100848acb35e61f81d39aaee.png
4.函数开辟
入口方法
入口方法定义如下:
```
module.exports.myHandler = function(event, context, callback, logger){} ```
- myHandler:入口方法名称。
- event:调用方传递的事件对象,JSON格式。具体内容请参见
(https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-cloudfunction-appx-event-0000001620581529#section12463185072710)。
- context:函数运行时上下文对象,封装了日志接口、回调接口、情况变量env对象等。
- callback:事件处理惩罚结果。
- logger:记载日志。
函数必须通过表现调用callback(object)将事件处理惩罚结果返回给AGC,结果可以是恣意对象,但必须与JSON.stringify兼容,AGC会将结果转换成JSON字符串后,返回给调用方。callback执行完成,函数即执行结束。
函数调用
1. **在“项目设置”页面下载配置文件“agconnect-services.json”**
https://img-blog.csdnimg.cn/direct/30a88ba13a454391aec7d2a3ce84c01c.png
2. **将“agconnect-services.json”文件拷贝到DevEco Studio项目的恣意应用级目录下,本文直接放在“entry/src/main/ets”目录下。**
3. **添加配置文件后,必要在DevEco Studio项目中配置SDK依赖**
- 打开DevEco Studio entry目录下的“oh-package.json5”文件,添加依赖
```js
"dependencies": {
"@hw-agconnect/hmcore": "^1.0.1",
"@hw-agconnect/cloud": "^1.0.1"
} ```
- 右上方出现“Sync Now”链接,点击“Sync Now”等候同步完成。
2. **集成AGC SDK**
- 在您的项目中导入agc组件,导入agconnect-services.json文件。
```js
// agconnect-services.json可放置在任意路径,本例中,agconnect-services.json放置在EntryAbility.ts的上级目录。
// @ts-ignore
import json from '../agconnect-services.json'; // DevEco import 非Ets/TS文件时会报错,可以加上@ts-ignore,不影响编译。
import { initialize } from '@hw-agconnect/hmcore'; ```
- 在您的应用初始化阶段利用context初始化SDK,推荐在EntryAbility的onCreate中进行。
```js
//初始化SDK
onCreate(want, launchParam) {
initialize(this.context, json);
} ```
- 在“entry/src/main/module.json5”文件中添加网络权限。
-
```js
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
] ```
- **集成SDK可能会遇到的so文件优先级问题**
在entry/build-profile.json5文件中添加配置
```js
{
"buildOption": {
"napiLibFilterOption": {
"pickFirsts": [
"**/1.so"
],
"pickLasts": [
"**/2.so"
],
"excludes": [
"**/3.so"
],
"enableOverride": true
},
}
} ```
3. **应用集成了云函数SDK后,可以在应用内直接通过SDK API调用AGC中的云函数,云函数SDK与AGC的函数调用基于HTTPS的安全访问。**
````js
//引入模块
import cloud from "@hw-agconnect/cloud";
let callFun = async ()=>{
let functionResult = await cloud.callFunction({
name:"函数名",
params:{//参数 函数内部通过event.body获取
"param1":"val1",
"param2":"val2"
}
});
console.log(functionResult.getValue())//拿到函数响应的结果
} ````
3、云数据库
云数据库开辟
> 云数据库是一款支持端云数据协同管理、可扩展的Serverless数据库产物,提供简朴易用的多平台原生SDK,应用可以通过SDK直接访问云侧数据库
https://img-blog.csdnimg.cn/direct/811258b1e7eb408bb6648688634d88f5.png
1.新增和导出对象类型文件
创建新的对象类型
输入“对象类型名”为“BookInfo”后,点击“下一步”
新增如下表字段后,点击“下一步”
| 字段名称 | 类型 | 主键 | 非空 | 加密 | 默认值 |
| -------- | ------- | ---- | ---- | ---- | ------ |
| id | Integer | ✓ | ✓ | – | – |
| bookName | String | – | – | – | – |
| author | String | – | – | – | – |
按照如下要求设置各脚色权限后,点击“下一步”
| 脚色 | query | upsert | delete |
| ---------- | ----- | ------ | ------ |
| 所有人 | ✓ | ✓ | ✓ |
| 认证用户 | ✓ | ✓ | ✓ |
| 数据创建者 | ✓ | ✓ | ✓ |
| 管理员 | ✓ | ✓ | ✓ |
点击“确定”。创建完成后返回对象类型列表,可以检察已创建的对象类型。
勾选创建的BookInfo对象类型,点击“导出”。若不勾选对象类型,默认导出所有对象类型
导出“json格式”和“js格式”文件,导出的文件在后续步调用于添加至本地开辟情况
新增存储区
2.在项目中利用
集成SDK,和云函数的用到的SDK同等
**加载对象类型文件**
将下载的两个文件放入ets/db/book/目录下
引入并利用
```js
// 注意目录,目录可以自定义
import { BookInfo } from './BookInfo';
import schema from './Bookinfo.json';
//QuickStartDemo存储区名称
async function upsert () {
const record = await cloud.database({objectTypeInfo: schema, zoneName: "QuickStartDemo"})
.collection(BookInfo)
.upsert({
"id":2000,
"bookName" : "book_name",
"author" : "huawei"
});
} ```
查询数据
```js
const resultArray = await cloud.database({objectTypeInfo: schema, zoneName: "QuickStartDemo"})
.collection(BookInfo)
.query()
.get(); ```
[更多数据库利用]
(https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-Guides/agc-clouddb-otheroperations-harmonyosts-0000001626432634)
4、认证服务
认证服务
> 认证服务可以为应用快速构建安全可靠的用户认证系统,开辟者只需在应用中访问认证服务的相干能力,而不必要关心云侧的设施和实现。
https://img-blog.csdnimg.cn/direct/f7a5190cbc454b00bd38a613faba618d.png
开辟步调
https://img-blog.csdnimg.cn/direct/50f18378b57949adada0de4ad8cc861c.png
1.申请手机注册的验证码
```js
import cloud from '@hw-agconnect/cloud';
import { Auth, VerifyCodeAction } from '@hw-agconnect/cloud';
cloud.auth().requestVerifyCode({
action: VerifyCodeAction.REGISTER_LOGIN,
lang: 'zh_CN',
sendInterval: 60,
verifyCodeType: {
phoneNumber: '138********',
countryCode: '86',
kind: "phone"
}
}).then(verifyCodeResult => {
//验证码申请成功
}).catch(error => {
//验证码申请失败
}); ```
2.利用手机号码注册用户
调用(https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-auth-0000001680370685#section19861514132515)注册用户。注册成功后,系统会自动登录,无需再次调用登录接口。
```js
cloud.auth().createUser({
kind: 'phone',
countryCode: '86',
phoneNumber: '138********',
password: 'your password',//可以给用户设置初始密码,后续可以用密码来登录
verifyCode: 'xxxx'
}).then(result => {
// 创建用户成功
}).catch(error => {
// 创建用户失败
}) ```
3.登录
```js
cloud.auth().signIn({
credentialInfo: {
kind: 'phone',
phoneNumber: '138********',
countryCode: '86',
password: 'your password'
}
}).then(user => {
//登录成功
}).catch(error => {
//登录失败
}); ```
4.在应用的登录界面
初始化(https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-auth-0000001680370685)实例,获取AGC的用户信息,检查是否有已经登录的用户。
如果有,则可以直接进入用户界面,否则表现登录界面。
```js
cloud.auth().getCurrentUser().then(user=>{
if(user){
//业务逻辑
}
}); ```
| 类型 | 方法名及描述 |
| :----- | :----------------------------------------------------------- |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section1312317535214)()获取用户ID,此ID由AGConnect生成。 |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section1320432912212)()获取用户邮箱。 |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section1169817018235)()获取用户手机号码。 |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section948316131197)()获取用户名称。 |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section1063155522017)()获取用户头像。 |
| string | (https://developer.huawei.com/consumer/cn/doc/AppGallery-connect-References/harmonyos-arkts-authuser-0000001680210801#section1324190192617)()获取当前用户的提供者,第三方认证平台的名称。 |
5.设置用户头像及昵称
```js
cloud.auth().getCurrentUser().then(user => {
user.updateProfile({
photoUrl: "https://xxx.png",
displayName: "HamonyOSUser"
})
}) ```
6.退出登录
```js
cloud.auth().signOut().then(() => {
//登出成功
}).catch(error => {
//登出失败
}); ```
| 错误码 | 错误码值 | 阐明 |
| ------------------------------------- | --------- | ------------------------------------------------------------ |
| NULL_TOKEN | 1210001 | Token为空,建议重新登录。 |
| NOT_SIGN_IN | 1210002 | 当前无已登任命户。 |
| USER_LINK_FAILED | 1210003 | 用户关联失败。 |
| USER_UNLINK_FAILED | 1210004 | 用户取消关联失败。 |
| ALREADY_SIGN_IN_USER | 1210005 | 已经利用一个帐号登录,在未登出情况下利用此帐号或者其他帐号登录。 |
| FAIL_TO_GET_ACCESS_TOKEN | 1210006 | 获取Access Token失败。 |
| FAIL_TO_UPDATE_PROFILE | 1210007 | 更新用户信息失败。 |
| FAIL_TO_UPDATE_EMAIL | 1210008 | 更新用户邮箱失败。 |
| CREDENTIAL_INVALID | 1210009 | 凭证信息不合法。 |
| INLVLID_EMAIL | 203817223 | 输入的邮箱所在不合法。
| INLVLID_PHONE | 203817224 | 输入的手机号码不合法。 |
| GET_UID_ERROR | 203817728 | 获取用户ID失败。 |
| UID_PRODUCTID_NOT_MATCH | 203817729 | 用户ID和项目ID不匹配。 |
| GET_USER_INFO_ERROR | 203817730 | 获取用户信息失败。 |
| AUTH_METHOD_NOT_SUPPORT | 203817732 | 当前认证微服务部署了4个局点,每个局点支持的认证方式不同。 |
| PRODUCT_STATUS_ERROR | 203817744 | 项目没有开通认证服务。 |
| PASSWORD_VERIFICATION_CODE_OVER_LIMIT | 203817811 | 暗码验证码次数超过限制。 |
| INVALID_TOKEN | 203817984 | Client Token不可用。 |
| INVALID_ACCESS_TOKEN | 203817985 | Access Token不可用。 |
| INVALID_REFRESH_TOKEN | 203817986 | Refresh Token不可用。用户的Refresh Token过期,重新登录,获取新的Refresh Token。 |
| TOKEN_AND_PRODUCTID_NOT_MATCH | 203817987 | Token和Product Id不匹配,建议检查“agconnect-services.json”是否与平台上申请的信息同等。 |
| AUTH_METHOD_IS_DISABLED | 203817988 | 不支持的认证方式。 |
| ACCESS_TOKEN_OVER_LIMIT | 203817991 | AccessToken数量超过了限定命量,配额是每个项目每个用户每小时500个。 |
| FAIL_TO_USER_LINK | 203817992 | 关联用户失败。 |
| FAIL_TO_USER_UNLINK | 203817993 | 取消用户关联失败。 |
| ANONYMOUS_SIGNIN_OVER_LIMIT | 203818019 | 同一IP下的匿名用户登录超过限制,配额是每小时100个哀求。 |
| INVALID_APPID | 203818020 | AppID不可用。 |
| INVALID_APPSECRET | 203818021 | App Secret不可用。 |
| PASSWORD_VERIFY_CODE_ERROR | 203818032 | 暗码和验证码错误。 |
| SIGNIN_USER_STATUS_ERROR | 203818036 | 用户被开辟者停用。 |
| SIGNIN_USER_PASSWORD_ERROR | 203818037 | 用户暗码错误。 |
| PROVIDER_USER_HAVE_BEEN_LINKED | 203818038 | 身份验证提供方已经被其他用户绑定。 |
| PROVIDER_HAVE_LINKED_ONE_USER | 203818039 | 帐号中该身份验证提供方类型已经被绑定过。 |
| FAIL_GET_PROVIDER_USER | 203818040 | 获取身份验证提供方用户失败。 |
| CANNOT_UNLINK_ONE_PROVIDER_USER | 203818041 | 不能对单一的身份验证提供方做取消关联利用。 |
| VERIFY_CODE_INTERVAL_LIMIT | 203818048 | 在发送隔断内发送验证码。 |
| VERIFY_CODE_EMPTY | 203818049 | 验证码为空。 |
| VERIFY_CODE_LANGUAGE_EMPTY | 203818050 | 验证码发送语言为空。 |
| VERIFY_CODE_RECEIVER_EMPTY | 203818051 | 验证码接收器为空。 |
| VERIFY_CODE_ACTION_ERROR | 203818052 | 验证码类型为空。 |
| VERIFY_CODE_TIME_LIMIT | 203818053 | 验证码发送次数超过限制。 |
| ACCOUNT_PASSWORD_SAME | 203818064 | 用户名暗码同等。 |
| PASSWORD_STRENGTH_LOW | 203818065 | 暗码强度太低。 |
| UPDATE_PASSWORD_ERROR | 203818066 | 更新暗码失败。 |
| PASSWORD_SAME_AS_BEFORE | 203818067 | 暗码与老暗码相同。 |
| PASSWORD_IS_EMPTY | 203818068 | 暗码为空。 |
| PASSWORD_TOO_LONG | 203818071 | 暗码太长。 |
| SENSITIVE_OPERATION_TIMEOUT | 203818081 | 敏感利用的最近登录时间超时。 |
| ACCOUNT_HAVE_BEEN_REGISTERED | 203818082 | 帐号已经被注册。 |
| UPDATE_ACCOUNT_ERROR | 203818084 | 更新帐号失败。 |
| USER_NOT_REGISTERED | 203818087 | 用户没有注册。 |
| VERIFY_CODE_ERROR | 203818129 | 验证码错误。 |
| USER_HAVE_BEEN_REGISTERED | 203818130 | 用户已经被注册。 |
| REGISTER_ACCOUNT_IS_EMPTY | 203818132 | 注册帐号为空。 |
| VERIFY_CODE_FORMAT_ERROR | 203818134 | 验证码格式错误。 |
| VERIFY_CODE_AND_PASSWORD_BOTH_NULL | 203818135 | 验证码和暗码都为空。 |
| SEND_EMAIL_FAIL | 203818240 | 发送邮件失败。 |
| SEND_MESSAGE_FAIL | 203818241 | 发送短信失败。 |
| CONFIG_LOCK_TIME_ERROR | 203818261 | 暗码/验证码最大尝试次数超过设定值后对帐号进行冻结处理惩罚,冻结期间用户无法利用该帐号进行暗码验证/验证码验证。 |
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]