鸿蒙中的网络请求之RCP远场通信
本文介绍了鸿蒙系统中的三种网络请求方式,重点讲解了RCP远场通信的实现方法。文章详细展示了如何配置网络权限、定义请求数据类型,并通过完整代码示例演示了GET、POST、PUT、DELETE四种HTTP请求的实现过程。其中GET请求用于获取数据并渲染页面,POST添加新数据,PUT修改现有数据,DELETE删除指定数据。每个请求都包含类型定义、请求函数和完整页面代码,并配有控制台输出和页面效果展示,
##鸿蒙核心技术##HarmonyOS SDK应用服务##RCP(远场通信)#
鸿蒙中网咯请求大约有三种方式:1.原生的HTTP请求,2.axios库,3.rcp远场通信
三种方式各有好坏,不过用的最多的应该还是axios,因为前端的网络请求可能基本都是axios,本文着重介绍鸿蒙原生的rcp远场通信
在开始前我们先做准备工作
新建一个baseUrl文件,如下:

如果是预览器中间的10.0.2.2可以写成127.0.0.1,用模拟器则是10.0.2.2,如果用真机的话可以写成同一网络下的ip地址
在module中配置网络权限:

1.get请求
定义get请求的返回的数据类型

代码如下:
export interface getReturnModel {
code: number;
message: string;
data: GetReturnModelData[];
}
export interface GetReturnModelData {
id: number;
name: string;
}
定义一个rcp请求的会话
const session=rcp.createSession()
完整函数如下:
rcpGet=()=>{
const session=rcp.createSession()
session.get(rcpBaseUrl).then((res:rcp.Response)=>{
// this.showList=(JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res",JSON.stringify(res))
}).catch((err:BusinessError)=>{
console.log("err",JSON.stringify(err))
})
}
完整页面如下:
import { rcp } from '@kit.RemoteCommunicationKit';
import { rcpBaseUrl } from '../rcpBaseUrl/rcpBaseUrl';
import { BusinessError } from '@kit.BasicServicesKit';
import { getReturnModel, GetReturnModelData } from '../Model/getReturnModel';
@Entry
@Component
struct RCPGetPage {
@State message: string = 'Hello World';
@State showList:GetReturnModelData[]=[]
rcpGet=()=>{
const session=rcp.createSession()
session.get(rcpBaseUrl).then((res:rcp.Response)=>{
// this.showList=(JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res",JSON.stringify(res))
}).catch((err:BusinessError)=>{
console.log("err",JSON.stringify(err))
})
}
build() {
Column() {
Button("get请求")
.onClick(() => {
this.rcpGet()
})
}
.height('100%')
.width('100%')
}
}
启动模拟器后,点击按钮的输出:

表示get请求成功
现在让我们把请求的数据渲染到页面上
完整代码如下:
import { rcp } from '@kit.RemoteCommunicationKit';
import { rcpBaseUrl } from '../rcpBaseUrl/rcpBaseUrl';
import { BusinessError } from '@kit.BasicServicesKit';
import { getReturnModel, GetReturnModelData } from '../Model/getReturnModel';
@Entry
@Component
struct RCPGetPage {
@State message: string = 'Hello World';
@State showList:GetReturnModelData[]=[]
rcpGet=()=>{
const session=rcp.createSession()
session.get(rcpBaseUrl).then((res:rcp.Response)=>{
this.showList=(JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res",JSON.stringify(res))
}).catch((err:BusinessError)=>{
console.log("err",JSON.stringify(err))
})
}
build() {
Column() {
Button("get请求")
.onClick(() => {
this.rcpGet()
})
ForEach(this.showList,(item:GetReturnModelData,index: number)=>{
Row(){
Text("id")
Blank().width(40)
Text(item.id.toString())
Blank().width(50)
Text("name")
Blank().width(40)
Text(item.name)
}
},(item:GetReturnModelData)=>JSON.stringify(item))
}
.height('100%')
.width('100%')
}
}
在模拟器中点击get请求按钮:
效果如下:

同时后端日志输出:

下面来看post请求
2.post请求
首先:定义请求的body类型

代码如下:
export interface postBodyModel{
name:string
}
然后定义请求的函数:
rcpPost = (name: string) => {
const session = rcp.createSession()
session.post(rcpBaseUrl, { name } as postBodyModel).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
整个页面代码为:
import { rcp } from '@kit.RemoteCommunicationKit';
import { rcpBaseUrl } from '../rcpBaseUrl/rcpBaseUrl';
import { BusinessError } from '@kit.BasicServicesKit';
import { getReturnModel, GetReturnModelData } from '../Model/getReturnModel';
import { postBodyModel } from '../Model/postBodyModel';
@Entry
@Component
struct RCPGetPage {
@State message: string = 'Hello World';
@State showList: GetReturnModelData[] = []
@State postName: string = ""
rcpGet = () => {
const session = rcp.createSession()
session.get(rcpBaseUrl).then((res: rcp.Response) => {
this.showList = (JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res", JSON.stringify(res))
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpPost = (name: string) => {
const session = rcp.createSession()
session.post(rcpBaseUrl, { name } as postBodyModel).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
build() {
Column() {
Button("get请求")
.onClick(() => {
this.rcpGet()
})
ForEach(this.showList, (item: GetReturnModelData, index: number) => {
Row() {
Text("id")
Blank().width(40)
Text(item.id.toString())
Blank().width(50)
Text("name")
Blank().width(40)
Text(item.name)
}
}, (item: GetReturnModelData) => JSON.stringify(item))
Line()
TextInput({ placeholder: "请输入post的名字", text: $$this.postName })
Button("post请求").onClick(() => {
this.rcpPost(this.postName)
})
}
.height('100%')
.width('100%')
}
}
在输入框输入1,点击post请求的按钮的控制台输出结果:

说明post成功
之后我们点击get请求的按钮,查看页面:

发现有我们刚刚post的1,并且id自增长
3.put请求
首先定义put的body的数据类的:

代码如下:
export interface putBodyModel{
id:number|string,
name:string
}
然后定义put的函数
rcpPut=(data:putBodyModel)=>{
const session=rcp.createSession()
session.put(rcpBaseUrl,data).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
最后整个页面的代码如下:
import { rcp } from '@kit.RemoteCommunicationKit';
import { rcpBaseUrl } from '../rcpBaseUrl/rcpBaseUrl';
import { BusinessError } from '@kit.BasicServicesKit';
import { getReturnModel, GetReturnModelData } from '../Model/getReturnModel';
import { postBodyModel } from '../Model/postBodyModel';
import { putBodyModel } from '../Model/putBodyModel';
@Entry
@Component
struct RCPGetPage {
@State message: string = 'Hello World';
@State showList: GetReturnModelData[] = []
@State postName: string = ""
@State putId:string=""
@State putData:string=""
rcpGet = () => {
const session = rcp.createSession()
session.get(rcpBaseUrl).then((res: rcp.Response) => {
this.showList = (JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpPost = (name: string) => {
const session = rcp.createSession()
session.post(rcpBaseUrl, { name } as postBodyModel).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpPut=(data:putBodyModel)=>{
const session=rcp.createSession()
session.put(rcpBaseUrl,data).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
build() {
Column() {
Button("get请求")
.onClick(() => {
this.rcpGet()
})
ForEach(this.showList, (item: GetReturnModelData, index: number) => {
Row() {
Text("id")
Blank().width(40)
Text(item.id.toString())
Blank().width(50)
Text("name")
Blank().width(40)
Text(item.name)
}
}, (item: GetReturnModelData) => JSON.stringify(item))
Divider().height(5).width("100%")
TextInput({ placeholder: "请输入post的名字", text: $$this.postName })
Button("post请求").onClick(() => {
this.rcpPost(this.postName)
})
Divider().height(5).width("100%")
TextInput({placeholder:"请输入put的id",text:$$this.putId})
TextInput({placeholder:"请输入put的名字",text:$$this.putData})
Button("put请求").onClick(()=>{
this.rcpPut({id:this.putId,name:this.putData})
})
}
.height('100%')
.width('100%')
}
}
现在我们在id输入框中输入8,data输入2,
那么就是:

然后点击put请求的按钮,发现控制台输出

说明修改成功
然后我们点击get请求,查看数据

发现确实修改成功
4.delete请求
请求体数据类型:

代码如下:
export interface deleteBodyModel {
id: string | number
}
请求函数:
由于delete不支持在body中配置参数,因此采用fetch的方式
rcpDelete=(data?:deleteBodyModel)=>{
const request = new rcp.Request(`${rcpBaseUrl}`, "DELETE", {
"Content-Type": "application/json"
}, data);
const session=rcp.createSession()
session.fetch(request).then((res: rcp.Response) => {
console.log("header",JSON.stringify(res.headers))
console.log("body",JSON.stringify(res.body))
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
整体页面代码如下:
import { rcp } from '@kit.RemoteCommunicationKit';
import { rcpBaseUrl } from '../rcpBaseUrl/rcpBaseUrl';
import { BusinessError } from '@kit.BasicServicesKit';
import { getReturnModel, GetReturnModelData } from '../Model/getReturnModel';
import { postBodyModel } from '../Model/postBodyModel';
import { putBodyModel } from '../Model/putBodyModel';
import { deleteBodyModel } from '../Model/deleteBodyModel';
@Entry
@Component
struct RCPGetPage {
@State message: string = 'Hello World';
@State showList: GetReturnModelData[] = []
@State postName: string = ""
@State putId:string=""
@State putData:string=""
@State deleteId:string=""
rcpGet = () => {
const session = rcp.createSession()
session.get(rcpBaseUrl).then((res: rcp.Response) => {
this.showList = (JSON.parse(JSON.stringify(res)) as getReturnModel).data
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpPost = (name: string) => {
const session = rcp.createSession()
session.post(rcpBaseUrl, { name } as postBodyModel).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpPut=(data:putBodyModel)=>{
const session=rcp.createSession()
session.put(rcpBaseUrl,data).then((res: rcp.Response) => {
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
rcpDelete=(data?:deleteBodyModel)=>{
const request = new rcp.Request(`${rcpBaseUrl}`, "DELETE", {
"Content-Type": "application/json"
}, data);
const session=rcp.createSession()
session.fetch(request).then((res: rcp.Response) => {
console.log("header",JSON.stringify(res.headers))
console.log("body",JSON.stringify(res.body))
console.log("res", JSON.stringify(res))
session.close()
}).catch((err: BusinessError) => {
console.log("err", JSON.stringify(err))
})
}
build() {
Column() {
Button("get请求")
.onClick(() => {
this.rcpGet()
})
ForEach(this.showList, (item: GetReturnModelData, index: number) => {
Row() {
Text("id")
Blank().width(40)
Text(item.id.toString())
Blank().width(50)
Text("name")
Blank().width(40)
Text(item.name)
}
}, (item: GetReturnModelData) => JSON.stringify(item))
Divider().height(5).width("100%")
TextInput({ placeholder: "请输入post的名字", text: $$this.postName })
Button("post请求").onClick(() => {
this.rcpPost(this.postName)
})
Divider().height(5).width("100%")
TextInput({placeholder:"请输入put的id",text:$$this.putId})
TextInput({placeholder:"请输入put的名字",text:$$this.putData})
Button("put请求").onClick(()=>{
this.rcpPut({id:this.putId,name:this.putData})
})
Divider().height(5).width("100%")
TextInput({placeholder:"请输入删除的id",text:$$this.deleteId})
Button("delete请求").onClick(()=>{
this.rcpDelete({id:this.deleteId})
})
}
.height('100%')
.width('100%')
}
}
现在在输入框中输入8,然后点击按钮:
控制台输出结果如下:

然后点击get请求查看数据源

发现id为8的数据已被成功删除
rcp的拦截器将在下一篇文章中解释
更多推荐


所有评论(0)