国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

HarmonyOS鴻蒙應(yīng)用開發(fā)——HTTP網(wǎng)絡(luò)訪問與封裝

這篇具有很好參考價值的文章主要介紹了HarmonyOS鴻蒙應(yīng)用開發(fā)——HTTP網(wǎng)絡(luò)訪問與封裝。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

網(wǎng)絡(luò)基礎(chǔ)

  • 網(wǎng)絡(luò)基礎(chǔ)-TCPIP協(xié)議分層模型
  • TCP協(xié)議-三次握手與四次揮手
  • UDP協(xié)議-簡單高效的傳輸協(xié)議
  • HTTP協(xié)議-應(yīng)用間的通信協(xié)議

基本使用

鴻蒙應(yīng)用發(fā)起HTTP請求的基本使用,如下:

  • 導(dǎo)入http模塊
  • 創(chuàng)建httpRequest對象
  • 發(fā)起http請求,并處理響應(yīng)結(jié)果

第一、導(dǎo)入http模塊:

import http from '@ohos.net.http'

第二、創(chuàng)建httpRequest對象,注意的是每一個httpRequest對象對應(yīng)一個http請求任務(wù),不可復(fù)用。

 const httpRequest = http.createHttp()

第三、發(fā)起請求,比如POST請求

 httpRequest.request(
  // 請求url地址
  url,
  {
    // 請求方式
    method: http.RequestMethod.POST,
    // 請求的額外數(shù)據(jù)。
    extraData: {
      "param1": "value1",
      "param2": "value2",
    },
    // 可選,默認(rèn)為60s
    connectTimeout: 60000,
    // 可選,默認(rèn)為60s
    readTimeout: 60000,
    // 開發(fā)者根據(jù)自身業(yè)務(wù)需要添加header字段
    header: {
      'Content-Type': 'application/json'
    }
  })
  .then((data) => { 
  if (data.responseCode === http.ResponseCode.OK) {
  	// 處理響應(yīng)結(jié)果
  	// data.result為服務(wù)器返回的業(yè)務(wù)數(shù)據(jù)
    console.info('Result:' + data.result);
    console.info('code:' + data.responseCode);
  }
}).catch((err) => {
 console.info('error:' + JSON.stringify(err));
});

最后需要聲明網(wǎng)絡(luò)權(quán)限,在module.josn5文件中聲明:

{
    "module" : {
        "requestPermissions":[
           {
             "name": "ohos.permission.INTERNET"
           }
        ]
    }
}

上面就是網(wǎng)絡(luò)請求的簡單使用,接下來通過Promise來封裝一個網(wǎng)絡(luò)請求庫,統(tǒng)一管理請求參數(shù)、響應(yīng)數(shù)據(jù)、日志的輸出等,對外屏蔽了細(xì)節(jié),使用者只需定義業(yè)務(wù)數(shù)據(jù)的實體類以及調(diào)用即可。

封裝

以**玩Android**開放接口為測試用例

定義業(yè)務(wù)數(shù)據(jù)的實體類,通過泛型來接收不同的數(shù)據(jù)類型:

export class ResponseResult<T> {
  errorCode: number;
  errorMsg: string;
  data?: T | Object | string;
}

把各種請求方式用枚舉聲明RequestMethod

export enum RequestMethod {
  OPTIONS,
  GET,
  HEAD,
  POST ,
  PUT,
  DELETE,
  TRACE,
  CONNECT
}

其實在http模塊中已經(jīng)有對應(yīng)的枚舉,之所以再用一個新枚舉來聲明,是簡化使用,同時也是將http模塊相關(guān)細(xì)節(jié)屏蔽掉不對外開放,這樣就可以靈活替換網(wǎng)絡(luò)庫,也具有擴(kuò)展性。

定義一個HttpUtils類實現(xiàn):

export class HttpUtils{
  public static readonly SUCCESS_CODE: number = 0
  public static readonly READ_TIME_OUT = 60 * 1000
  public static readonly CONNECT_TIME_OUT = 60 * 1000
  private baseUrl: string = ""

  constructor(baseUrl: string) {
    this.baseUrl = baseUrl
  }

  private methodName(method: RequestMethod): http.RequestMethod {
    switch (method){
      case RequestMethod.OPTIONS:{
        return http.RequestMethod.OPTIONS
      }
      case RequestMethod.GET:{
        return http.RequestMethod.GET
      }
      case RequestMethod.HEAD:{
        return http.RequestMethod.HEAD
      }
      case RequestMethod.POST:{
        return http.RequestMethod.POST
      }
      case RequestMethod.PUT:{
        return http.RequestMethod.PUT
      }
      case RequestMethod.DELETE:{
        return http.RequestMethod.DELETE
      }
      case RequestMethod.TRACE:{
        return http.RequestMethod.TRACE
      }
      case RequestMethod.CONNECT:{
        return http.RequestMethod.CONNECT
      }

    }

  }

  private tag(n: string): string {
    return `${TAG}/${n}`
  }

  request<T>(path: string, reqMethod: RequestMethod, parameter: Map<string, Object> = null): Promise<T | null> {
    // 注意的是每一個httpRequest對象對應(yīng)一個http請求任務(wù),不可復(fù)用。
    const httpRequest = http.createHttp()
    const method = this.methodName(reqMethod)
    let extraData = {}
    let url = `${this.baseUrl}/${path}`
    if (parameter != null) {
      switch (reqMethod) {
        case RequestMethod.POST, RequestMethod.PUT: {
          extraData = Object.fromEntries(parameter)
          break;
        }
        case RequestMethod.GET,RequestMethod.DELETE: {
          const urlParams = Object.keys(parameter).map(key => `${key}=${parameter[key]}`).join('&')
          if (url.includes("?")) {
            url = `${url}${urlParams}`
          } else {
            url = `${url}?${urlParams}`
          }
          break;
        }
      }
    }
    let n = Math.random().toString(10).slice(2)
    LogUtils.debug(this.tag(n), "==================Request====================")
    LogUtils.debug(this.tag(n), "url: " + url)
    LogUtils.debug(this.tag(n), "method: " + method.toString())
    if (reqMethod == RequestMethod.POST || reqMethod == RequestMethod.PUT)
      LogUtils.debug(this.tag(n), "extraData: " + JSON.stringify(parameter, null, 2))

    return new Promise( async (resolve, reject) => {
      let beginTime = await systemDateTime.getCurrentTime(false)
      httpRequest.request(url,
        {
          method,
          readTimeout: HttpUtils.READ_TIME_OUT,
          connectTimeout: HttpUtils.CONNECT_TIME_OUT,
          header: {
            'Content-Type': 'application/json'
          },
          extraData
        }
      ).then( async (value) => {
        let endTime = await systemDateTime.getCurrentTime(false)
        LogUtils.debug(this.tag(n), "==================Response====================")
        LogUtils.debug(this.tag(n), "url: " + url + " "+ (endTime - beginTime)+"ms")
        LogUtils.debug(this.tag(n), "method: " + method.toString())
        LogUtils.debug(this.tag(n), "header: " + JSON.stringify(value.header, null, 2))
        LogUtils.debug(this.tag(n), "responseCode: " + value.responseCode)
        LogUtils.debug(this.tag(n), "resultType: " + value.resultType)
        if (value.responseCode == http.ResponseCode.OK) {
          let result: ResponseResult<T> = JSON.parse(value.result.toString())
          LogUtils.debug(this.tag(n), "body: " + JSON.stringify(result, null, 2))
          if (result.errorCode == HttpUtils.SUCCESS_CODE) {
            resolve(result.data as T)
          } else {
            reject(result.errorMsg)
          }
        } else {
          reject("請求失敗")
        }
      }).catch((reason) => {
        reject(reason)
      })
    })
  }

  get<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {
    return this.request<T>(path, RequestMethod.GET, parameter)
  }

  post<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {
    return this.request<T>(path, RequestMethod.POST, parameter)
  }

  delete<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {
    return this.request<T>(path, RequestMethod.DELETE, parameter)
  }

  put<T>(path: string, parameter: Map<string, Object> = null): Promise<T | null> {
    return this.request<T>(path, RequestMethod.PUT, parameter)
  }

}
const YiNet = new HttpUtils(BASE_URL)
export default YiNet

使用發(fā)起網(wǎng)絡(luò)請求:

  aboutToAppear() {
    let map = new Map<string,string>()
    map["cid"] = 294
    YiNet.get<ArticleList>("project/list/1/json",map).then((data)=>{
      this.data = JSON.stringify(data, null, 2)
    })

    let map2 = new Map<string,string>()
    map2["username"] = "123"
    map2["password"] = "123456"
    YiNet.post<User>("user/login",map2).then((data)=>{
      this.data = JSON.stringify(data, null, 2)
    }).catch((err)=>{
      Prompt.showToast({message:err})
    })
  }

日志輸出效果:

華為鴻蒙開發(fā)新聞demo里的http請求的域名,HarmonyOS應(yīng)用開發(fā),harmonyos,http,華為,網(wǎng)絡(luò)封裝,鴻蒙,udp,tcp
如果有多個請求,日志可能會混合交叉不利于查看,可以通過HttpUtils/xxxxxx來查看具體某一個請求日志,其中xxxx是一個隨機(jī)數(shù)大部分情況下是具有唯一性。

上面就是官方的http模塊的基本封裝,在此基礎(chǔ)上可以設(shè)計一套攔截器來輔助業(yè)務(wù)需求。文章來源地址http://www.zghlxwxcb.cn/news/detail-764461.html

參考

  • https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667364948559963?ha_linker=eyJ0cyI6MTcwMjE3NzI3OTYyMywiaWQiOiI4MmM3ZTI1MmFmMDJlMDZiODBmOGU1ZDM5ZTI5YmMyOCJ9
  • https://www.wanandroid.com/blog/show/2

到了這里,關(guān)于HarmonyOS鴻蒙應(yīng)用開發(fā)——HTTP網(wǎng)絡(luò)訪問與封裝的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 鴻蒙HarmonyOS應(yīng)用開發(fā)初體驗

    鴻蒙HarmonyOS應(yīng)用開發(fā)初體驗

    最近華為發(fā)布mt60新機(jī)火了,作為一名移動開發(fā)程序員,對鴻蒙系統(tǒng)開發(fā)移動端就很感興趣了。 開發(fā)工具:HUAWEI DevEco Studio和SDK下載和升級 | HarmonyOS開發(fā)者 下載完后按默認(rèn)安裝就可以了,界面跟AS很類似,之前我jdk環(huán)境配置就不在配置了,不懂的可以百度下很多教程。 這是基

    2024年02月09日
    瀏覽(26)
  • 鴻蒙應(yīng)用開發(fā)嘗鮮:初識HarmonyOS

    鴻蒙應(yīng)用開發(fā)嘗鮮:初識HarmonyOS

    來源:華為官方網(wǎng)站 : https://developer.huawei.com/ 相信大家對鴻蒙應(yīng)用開發(fā)也不在陌生,很多身處互聯(lián)網(wǎng)行業(yè)或者不了解的人們現(xiàn)在也一定都聽說過華為鴻蒙.這里我將不再說廢話,直接步入正題 HarmonyOS應(yīng)用開發(fā)采用的是ArkTS語言,ArkTS是在TypeScript(簡稱TS)基礎(chǔ)上的拓展,而TS又是JavaScrip

    2024年02月02日
    瀏覽(34)
  • 【HarmonyOS】開發(fā)一個可以看小姐姐的鴻蒙應(yīng)用 鴻蒙開發(fā)入門

    【HarmonyOS】開發(fā)一個可以看小姐姐的鴻蒙應(yīng)用 鴻蒙開發(fā)入門

    先整張效果圖,丑點是丑點,但可以用,買不起鴻蒙系統(tǒng)手機(jī)的我,只配用虛擬機(jī)。 要說目前最火的手機(jī)操作系統(tǒng),要我來看的話那必然是鴻蒙無疑。16號剛剛結(jié)束了第五次鴻蒙內(nèi)測,在看到這次的內(nèi)測名單之后,居然有970的機(jī)器,這是不是說明俺這手里奮戰(zhàn)了三年的榮耀

    2024年02月15日
    瀏覽(28)
  • 【HarmonyOS】鴻蒙應(yīng)用開發(fā)基礎(chǔ)認(rèn)證題目

    【HarmonyOS】鴻蒙應(yīng)用開發(fā)基礎(chǔ)認(rèn)證題目

    【HarmonyOS】鴻蒙應(yīng)用開發(fā)基礎(chǔ)認(rèn)證題目; 隨著鴻蒙系統(tǒng)的不斷發(fā)展,前不久,華為宣布了重磅消息,HarmonyOS next 開發(fā)者版本會在明年(2024)開放,并不再支持Android應(yīng)用!這也意味著,移動端開發(fā)者今后又多了一個適配平臺,也到了必須學(xué)的時候了。 目前已知一線大廠均已開

    2024年02月04日
    瀏覽(85)
  • 【鴻蒙開發(fā)】HarmonyOS應(yīng)用開發(fā)者基礎(chǔ)認(rèn)證題庫

    【鴻蒙開發(fā)】HarmonyOS應(yīng)用開發(fā)者基礎(chǔ)認(rèn)證題庫

    華為開發(fā)者學(xué)堂 ? 1、考試需實名認(rèn)證,請在考前于個人主頁→個人信息→基本信息→進(jìn)行實名認(rèn)證,否則考試通過無法獲取專業(yè)證書; 2、每個帳號每月有3次考試機(jī)會,次月重置考試次數(shù)。做題過程中請認(rèn)真對待,避免考試次數(shù)浪費(fèi); 3、考試時長為1小時,請合理分配做題

    2024年03月09日
    瀏覽(98)
  • HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 流轉(zhuǎn)圖標(biāo)

    HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 流轉(zhuǎn)圖標(biāo)

    HarmonyOS設(shè)計文檔中,為大家提供了獨特的流轉(zhuǎn)圖標(biāo),開發(fā)者可以根據(jù)需要直接引用。 開發(fā)者直接使用官方提供的流轉(zhuǎn)圖標(biāo)內(nèi)容,既可以符合HarmonyOS原生應(yīng)用的開發(fā)上架運(yùn)營規(guī)范,又可以防止使用別人的圖標(biāo)侵權(quán)意外情況等,減少自主創(chuàng)作流轉(zhuǎn)圖標(biāo)的工作量。當(dāng)然,如果有個性

    2024年02月07日
    瀏覽(88)
  • HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 隱私聲明

    HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 隱私聲明

    HarmonyOS設(shè)計文檔中,為大家提供了獨特的隱私聲明,開發(fā)者可以根據(jù)需要直接引用。 開發(fā)者直接使用官方提供的隱私聲明內(nèi)容,既可以符合HarmonyOS原生應(yīng)用的開發(fā)上架運(yùn)營規(guī)范,又可以防止使用別人的內(nèi)容產(chǎn)生的侵權(quán)意外情況等,減少自主創(chuàng)作隱私聲明的工作量。當(dāng)然,如果

    2024年02月05日
    瀏覽(90)
  • 鴻蒙(HarmonyOS)應(yīng)用開發(fā)——構(gòu)建頁面(題目答案)

    1.在Column容器中的子組件默認(rèn)是按照從上到下的垂直方向布局的,其主軸的方向是垂直方向,在Row容器中的組件默認(rèn)是按照從左到右的水平方向布局的,其主軸的方向是水平方向。 正確(True) 2.List容器可以沿水平方向排列,也可以沿垂直方向排列。 正確(True) 3.當(dāng)Tabs組件的參數(shù)

    2024年01月20日
    瀏覽(35)
  • HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 圖標(biāo)庫

    HarmonyOS鴻蒙原生應(yīng)用開發(fā)設(shè)計- 圖標(biāo)庫

    HarmonyOS設(shè)計文檔中,為大家提供了獨特的圖標(biāo)庫,開發(fā)者可以根據(jù)需要直接引用。 圖標(biāo)庫可以分為雙色圖標(biāo)、填充圖標(biāo)、線性圖標(biāo)。具體分為 鍵盤、箭頭、連接狀態(tài)、媒體、人、設(shè)備、索引、通信、文件、物體與工具等。 整體分類 開發(fā)者直接使用官方提供的圖標(biāo)庫內(nèi)容,既

    2024年02月07日
    瀏覽(103)
  • 鴻蒙應(yīng)用開發(fā)學(xué)習(xí)路線(OpenHarmony/HarmonyOS)

    鴻蒙應(yīng)用開發(fā)學(xué)習(xí)路線(OpenHarmony/HarmonyOS)

    作者:堅果 團(tuán)隊:堅果派 公眾號:“大前端之旅” 潤開鴻技術(shù)專家,華為HDE,InfoQ簽約作者,OpenHarmony布道師,擅長HarmonyOS應(yīng)用開發(fā)、熟悉服務(wù)卡片開發(fā),在“戰(zhàn)碼先鋒”活動中作為大隊長,累計培養(yǎng)三個小隊長,帶領(lǐng)100+隊員完成Pr的提交合入。 歡迎通過主頁或者私信聯(lián)系

    2024年02月15日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包