ArkTS 原生模块 @ohos.net.http 请求远程接口。
目录
1 ArkTs 封装 http请求函数
import http from '@ohos.net.http';
// request请求参数
export interface httpOptions {
timeOut?: number;
ContentType?: string;
header?: Object;
state?: string;
callBack?: Function;
}
const HTTP_READ_TIMEOUT = 60000;
const HTTP_CONNECT_TIMEOUT = 60000;
const CONTENT_TYPE = 'application/json'
// 封装request请求
export function httpRequest(
url: string,
method: http.RequestMethod = http.RequestMethod.GET,
params?: string | Object | ArrayBuffer,
options?: httpOptions
): Promise<ResponseResult> {
const request = http.createHttp();
// 处理状态
if(options?.state) {
switch (options.state) {
case 'on':
request.on('headersReceive', (header) => options.callBack(header));
break;
case 'once':
request.on('headersReceive', (header) => options.callBack(header));
break;
case 'off':
request.off('headersReceive');
break;
case 'destroy':
request.destroy();
break;
default:
break;
}
return;
}
// 处理请求
const responseResult = request.request(url, {
// 超时时间
readTimeout: options?.timeOut || HTTP_READ_TIMEOUT,
connectTimeout: options?.timeOut || HTTP_CONNECT_TIMEOUT,
method,
extraData: params || {},
header: options?.header || {
'Content-Type': options?.ContentType || CONTENT_TYPE
},
});
let serverData: ResponseResult = new ResponseResult();
// Processes the data and returns.
return responseResult.then((data: http.HttpResponse) => {
if (data.responseCode === http.ResponseCode.OK) {
// Obtains the returned data.
let result = `${data.result}`;
let resultJson: ResponseResult = JSON.parse(result);
serverData.result = resultJson.result;
serverData.code = resultJson.code;
serverData.msg = resultJson?.msg;
} else {
serverData.msg = `error info & ${data.responseCode}`;
}
return serverData;
}).catch((err) => {
serverData.msg = `${err}`;
return serverData;
})
}
// 封装请求数据
export class ResponseResult {
/**
* Code returned by the network request: success, fail.
*/
code: string;
/**
* Message returned by the network request.
*/
msg: string | Resource;
/**
* Data returned by the network request.
*/
result: string | Object | ArrayBuffer;
constructor() {
this.code = '';
this.msg = '';
this.result = '';
}
}
export default httpRequest;
2 使用
import httpRequest from '../utils/requestHttp';
@State url1: string = "192.168.3.4:9909/arkts/sample/jwt3?param=param";
// 定义接受对象
interface resultType {
code: string;
msg: string;
result: resultValType | null;
}
// 定义返回数据对象
interface resultValType {
jwtId:number //对象属性
jwt: string; //对象属性
}
// 调用http接口
requestHttp1(){
httpRequest(this.url1).then(res => {
const data: resultType = res as resultType;
console.info(JSON.stringify(data));
});
}
3 后端数据格式
后端使用Java,返回的数据做了一层封装,格式:
{"code":200,"msg":"操作成功","result":{"jwtId":1,"jwt":"jwt@222313"}}
code状态码,msg消息描述,result返回对象数据,这里包含一个int数据项jwtId和一个字符串数据项jwt。
4 code 201 异常的解决办法
如果调用抛出异常 {"code":201,"message":"Permission denied"},是因为http请求需要 ohos.permission.INTERNET 权限。
在项目文件 module.json5 中添加 http 权限
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]