概述
本示例仿postman输入API接口地址,获取相应数据,介绍数据请求接口的用法。
样例展示
基础信息
Http
介绍
本示例通过[@ohos.net.http]等接口,实现了根据URL地址和相关配置项发起http请求的功能。
效果预览
首页 | 结果页 |
---|---|
使用说明
1.启动应用可配置网络请求,设置网址、请求方式、请求参数;
2.点击确认按钮,跳转请求结果页面;
3.点击返回按钮,返回配置页面;
4.支持将本示例中的http模块编译成tgz包。
具体实现
- 本示例将发送http请求的接口封装在Http模块,源码参考:[http.ts]
/*
* Copyright (c) 2022 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import http from '@ohos.net.http'
class Http {
url: string
extraData: Object
options: http.HttpRequestOptions
constructor() {
this.url = ''
this.options = {
method: http.RequestMethod.GET,
extraData: this.extraData,
header: { 'Content-Type': 'application/json' },
readTimeout: 50000,
connectTimeout: 50000
}
}
setUrl(url: string) {
this.url = url
}
setMethod(method: string) {
switch (method) {
case 'GET':
this.options.method = http.RequestMethod.GET;
break
case 'HEAD':
this.options.method = http.RequestMethod.HEAD;
break
case 'OPTIONS':
this.options.method = http.RequestMethod.OPTIONS;
break
case 'TRACE':
this.options.method = http.RequestMethod.TRACE;
break
case 'DELETE':
this.options.method = http.RequestMethod.DELETE;
break
case 'POST':
this.options.method = http.RequestMethod.POST;
break
case 'PUT':
this.options.method = http.RequestMethod.PUT;
break
case 'CONNECT':
this.options.method = http.RequestMethod.CONNECT;
break
default:
this.options.method = http.RequestMethod.GET;
break
}
}
setExtraData(extraData: Object) {
this.options.extraData = extraData
}
setOptions(option: Object) {
this.options = option
}
setList(list: number[], flag: number) {
list = []
for (let i = 0; i < flag; i++) {
list[i] = i
}
return list
}
setParameter(keys: string[], values: string[]) {
let result = {}
for (let i = 0; i <= keys.length - 1; i++) {
let key = keys[i]
let value = values[i]
result[key] = value
}
return result
}
async request() {
let httpRequest = http.createHttp()
httpRequest.on('dataReceive', function (data) {
AppStorage.SetOrCreate('dataLength', data.byteLength);
console.info('[ Demo dataReceive ] ReceivedDataLength: ' + data.byteLength);
});
httpRequest.on('dataReceiveProgress', function (data) {
AppStorage.SetOrCreate('receiveSize', data.receiveSize);
AppStorage.SetOrCreate('totalSize', data.totalSize);
console.info('[ Demo dataProgress ] ReceivedSize: ' + data.receiveSize + ' TotalSize: ' + data.totalSize);
});
httpRequest.requestInStream(this.url, this.options);
}
}
export default new Http()
发起请求:在[MainPage.ets]
/*
* Copyright (c) 2022-2023 Huawei Device Co., Ltd.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import router from '@ohos.router'
import Http from '../model/http'
AppStorage.SetOrCreate('receiveSize', 0)
AppStorage.SetOrCreate('totalSize', 0)
AppStorage.SetOrCreate('dataLength', 0)
@Entry
@Component
export struct setting {
private getUri: string = ''
private getOption?: object
@State url: string = ''
@State option?: object = undefined
@State flag: number = 1
@State keys: string[] = []
@State list: number[] = [0]
@State values: string[] = []
@State result: string = ''
@State method: string = 'GET'
@State showPage: boolean = false
@State resultInfo: string = ''
@State methods: Array<string> = ['GET', 'HEAD', 'OPTIONS', 'TRACE', 'DELETE', 'POST', 'PUT', 'CONNECT']
@Builder MenuBuilder() {
Column() {
ForEach(this.methods, (item: string) => {
Text(item)
.margin(5)
.fontSize(16)
.textAlign(TextAlign.Center)
.onClick(() => {
this.method = item
})
Divider().height(1)
}, (item: string) => item.toString())
}
.width('180vp')
}
aboutToAppear() {
this.url = this.getUri
this.option = this.getOption
Http.setUrl(this.url)
let context: Context = getContext(this)
this.resultInfo = context.resourceManager.getStringSync($r('app.string.result').id)
setInterval(() => {
if (Http.url !== '') {
this.result = "\r\nThe length of the data received by this callback: " +
JSON.stringify(AppStorage.Get('dataLength') as number) +
"\r\n" + "The length of the data received: " +
JSON.stringify(AppStorage.Get('receiveSize') as number) + "\r\n" + "Total length of data: " +
JSON.stringify(AppStorage.Get('totalSize') as number) + "\r\n" + "Percentage: " +
JSON.stringify(Math.floor((AppStorage.Get('receiveSize') as number) /
(AppStorage.Get('totalSize') as number) * 10000) / 100) + '%'
} else {
this.result = 'Failed'
}
}, 10)
}
build() {
Scroll() {
Column() {
if (!this.showPage) {
Text($r('app.string.configuration'))
.margin('2%')
.fontSize(28)
Row() {
Text(this.method)
.width('20%')
.fontSize(18)
.textAlign(TextAlign.Center)
.bindMenu(this.MenuBuilder)
.margin({ left: 2, right: 4 })
TextInput({ placeholder: $r('app.string.web') })
.width('75%')
.margin({ left: 4, right: 2 })
.enableKeyboardOnFocus(false)
.onChange((value: string) => {
this.url = value
})
.id('GET')
}
.width('95%')
.height('10%')
ForEach(this.list, (item: number, index: number) => {
Row() {
Text('Key: ')
.width('20%')
.fontSize(18)
.margin({ left: 2, right: 4 })
.textAlign(TextAlign.Center)
TextInput({ placeholder: $r('app.string.key') })
.width('76%')
.margin({ left: 4, right: 2 })
.onChange((value: string) => {
this.keys[this.flag - 1] = value
})
.id(`key${index + 1}`)
}
.width('95%')
.height('10%')
Row() {
Text('Value: ')
.width('20%')
.fontSize(18)
.margin({ left: 2, right: 4 })
.textAlign(TextAlign.Center)
TextInput({ placeholder: $r('app.string.value') })
.width('75%')
.margin({ left: 4, right: 2 })
.onChange((value: string) => {
this.values[this.flag -1] = value
})
.id(`value${index + 1}`)
}
.width('95%')
.height('10%')
}, (item: number) => item.toString())
Column() {
Button($r('app.string.add'))
.margin(10)
.fontSize(20)
.width('60%')
.onClick(() => {
this.flag += 1
this.list = Http.setList(this.list, this.flag)
})
.id('add')
Button($r('app.string.reduce'))
.margin(10)
.fontSize(20)
.width('60%')
.onClick(() => {
if (this.flag !== 1) {
this.flag -= 1
}
this.list = Http.setList(this.list, this.flag)
})
.id('reduce')
Button($r('app.string.reset'))
.id('reset')
.margin(10)
.fontSize(20)
.width('60%')
.onClick(() => {
this.flag = 1
this.list = [0]
})
Button($r('app.string.confirm'))
.margin(10)
.fontSize(20)
.width('60%')
.onClick(async () => {
Http.setUrl(this.url)
Http.setMethod(this.method)
Http.setExtraData(Http.setParameter(this.keys, this.values))
try {
Http.request()
} catch (err) {
this.result = 'Failed'
}
this.showPage = !this.showPage
})
.id('submit')
Button($r('app.string.back'))
.id('back')
.margin(10)
.fontSize(20)
.width('60%')
.onClick(() => {
router.replace({
url: 'pages/Index',
params: {
url: this.url === '' ? Http.url : this.url,
option: Http.options
}
})
})
}
.margin({ top: '2%', bottom: '2%' })
.width('100%')
} else {
Text(`${this.resultInfo} ${this.result}`)
.id(`${this.result === '' || this.result === 'Failed' ? 'failed' : 'succeed'}`)
.fontSize(20)
.margin('5%')
Button($r('app.string.back'))
.fontSize(25)
.onClick(() => {
AppStorage.SetOrCreate('receiveData', 0)
AppStorage.SetOrCreate('totalSize', 0)
AppStorage.SetOrCreate('dataLength', 0)
this.url = ''
this.flag = 1
this.keys = []
this.list = [0]
this.values = []
this.result = ''
this.method = 'GET'
this.showPage = !this.showPage
})
.id('back')
}
}
}
.width('100%')
.height('100%')
}
}
通过TextInput组件获取参数,点击“确认”按钮后通过Http.request()方法调用http.createHttp().request()接口向指定的地址发送请求。
鸿蒙OpenHarmony知识已更新←点