50、鸿蒙/HTTP数据请求

场景介绍

应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。

接口说明

HTTP数据请求功能主要由http模块提供。

使用该功能需要申请ohos.permission.INTERNET权限。

权限申请请参考声明权限

涉及的接口如下表,具体的接口说明请参考API文档

http.png

request接口开发步骤

  • 从@kit.NetworkKit中导入http命名空间。
  • 调用createHttp()方法,创建一个HttpRequest对象。
  • 调用该对象的on()方法,订阅http响应头事件,此接口会比request请求先返回。可以根据业务需要订阅此消息。
  • 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
  • 按照实际业务需要,解析返回结果。
  • 调用该对象的off()方法,取消订阅http响应头事件。
  • 当该请求使用完毕时,调用destroy()方法主动销毁。

案例

  • 配置权限
项目/entry/src/main/module.json5
 "requestPermissions": [
      {
        "name" : "ohos.permission.INTERNET"
      }
],
import { httpRequestPost } from './utils/HttpUtil'
// 定义数据类型接口
interface UserVO {
  createBy: string;
  createTime: string;
  updateBy: string;
  remark: string;
  updateTime: string;
  datetime: string;
  userId: number;
  userName: string;
  // 部门对象
  dept: DeptVO
}
//
interface DeptVO {
  deptName: string;
  deptId: number;
}

@Component
export struct HttpLayout {
  // 存放数据集
  @State list: Array<UserVO> = [];
  build() {
    Column(){
      Button('点击发送请求').onClick(async (event: ClickEvent) => {
        let data = new Map<string, object>();
        data.set("userName", new String("admin"));
        let result = await httpRequestPost('http://ip:端口/user/getList', data)
        //
        this.list = result.data as Array<UserVO>;
        console.log('result ==== ', JSON.stringify(this.list));
      });
      //
      Button('点击修改值').onClick((event: ClickEvent) => {
        // 获取当前下标元素
        if(this.list?.length < 1){return;}
        let currentData = this.list[0]
        // 修改元素的值
        currentData.userName = `${currentData.userName}+update`;
        // 同等位置修改元素,刷新视图(@State监听不到深节点元素值改变)
        this.list.splice(0, 1, currentData);
      });
      // 布局
      Flex({
        direction: FlexDirection.Column
      }){
        ForEach(this.list, (item: UserVO)=>{
          Row(){
            Text(`用户名称:${item.userName};`).lineHeight(22)
            Text(`用户编号:${item.userId};`).lineHeight(22)
            Text(`部门名称:${item.dept.deptName}`).lineHeight(22)
          }
        })
      }
    }
  }
}

HttpUtil.ets

//
import { http } from '@kit.NetworkKit';
//
import { BusinessError } from '@kit.BasicServicesKit';
//
import { ResponseResult } from './ResponseResult';
//
import { JsonUtil } from './JsonUtil'
//
class Constants {
  static readonly HTTP_CODE_200: number = 200;
}
const enum ContentType {
  JSON = 'application/json',
  FORM = 'multipart/form-data'
}
//
export function httpRequestGet(url: string) {
  return httpRequest(url, http.RequestMethod.GET);
}
//
export function httpRequestPost(url: string, params: Map<string, object>) {
  return httpRequest(url, http.RequestMethod.POST, params);
}
//
export function httpRequestGetHtml(url: string) {
  let httpRequest = http.createHttp();
  let responseResult = httpRequest.request(url, {
    method: http.RequestMethod.GET,
    header: {
      'Content-Type': ContentType.JSON
    },
  });

  let serverData = new ResponseResult();
  //
  return responseResult.then((value:http.HttpResponse)=>{
    if(value.responseCode === Constants.HTTP_CODE_200){
      let result = `${value.result}`;
      serverData.data = result;
      serverData.code = 'success'
      serverData.msg = value.header['set-cookie'];
    }else {
      serverData.msg = `${$r('app.string.http_error_message')}&${value.responseCode}`;
    }
    //
    httpRequest.destroy();
    //
    return serverData;
  }).catch((error: Error) => {
    serverData.msg = $r('app.string.http_error_message');
    //
    httpRequest.destroy();
    //
    return serverData;
  });
}
//
function httpRequest(url: string, method: http.RequestMethod, params?: Map<string, object>): Promise<ResponseResult> {
  let httpRequest = http.createHttp();
  let responseResult = httpRequest.request(url, {
    method: method,
    //
    header: {
      'Content-Type': ContentType.JSON,
    },
    //
    extraData: JsonUtil.mapToJsonObj(params)
  });

  let serverData = new ResponseResult();
  //
  return responseResult.then((value:http.HttpResponse)=>{

    if(value.responseCode === Constants.HTTP_CODE_200){

      let result = `${value.result}`;
      let resultJson: ResponseResult = JSON.parse(result);
      serverData.data = resultJson.data;
      serverData.code = resultJson.code;
      serverData.msg = resultJson.msg;
      serverData.has_more = resultJson.has_more;
      serverData.return_count = resultJson.return_count;
      serverData.page_id = resultJson.page_id;
      serverData.code = 'success'
    }else {
      serverData.msg = `${$r('app.string.http_error_message')}&${value.responseCode}`;
    }
    //
    httpRequest.destroy();
    //
    return serverData;
  }).catch((error: Error) => {
    serverData.msg = $r('app.string.http_error_message');
    //
    httpRequest.destroy();
    //
    return serverData;
  });
}

ResponseResult.ets

export class ResponseResult {
  code: string;
  msg: string | Resource;
  data: string | Object | ArrayBuffer;
  has_more: boolean;
  return_count: number;
  page_id: string;

  constructor() {
    this.code = '';
    this.msg = '';
    this.data = '';
    this.has_more = false;
    this.return_count = 0;
    this.page_id = '';
  }
}

JsonUtil.ets

export class JsonUtil {
  /**
   * map转换json字符串
   * @param mapSource
   * @returns
   */
  static mapToJsonStr(mapSource?: Map<string, object>): string{
    let jsonObject: Record<string, Object> = {};
    if(!mapSource){
      return JSON.stringify({});
    }
    //
    mapSource.forEach((value, key) => {
      if (key !== undefined && value !== undefined) {
        jsonObject[key] = value;
      }
    });
    //
    let jsonInfo: string = JSON.stringify(jsonObject);
    //
    return jsonInfo;
  }
  /**
   * map转换json对象
   * @param mapSource
   * @returns
   */
  static mapToJsonObj(mapSource?: Map<string, object>): object{
    //
    let jsonObject = JsonUtil.mapToJsonStr(mapSource);
    //
    return JSON.parse(jsonObject);
  }
}

效果

Http.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容