鴻蒙網(wǎng)絡(luò)編程系列9-使用HttpRequest模擬登錄示例

1. HTTP協(xié)議簡(jiǎn)介

HTTP(Hypertext Transfer Protocol)協(xié)議是現(xiàn)代互聯(lián)網(wǎng)的基石協(xié)議之一炕矮,有著最廣泛的應(yīng)用,于1991年由英國(guó)計(jì)算機(jī)科學(xué)家蒂姆·伯納斯·李(Tim Berners-Lee)正式提出喉前,當(dāng)時(shí)被稱為HTTP協(xié)議0.9版本放椰;1996年通過(guò)RFC 1945發(fā)布了1.0版本蚣驼,當(dāng)然底洗,這些都不是正式的Internet標(biāo)準(zhǔn),第一個(gè)正式的HTTP協(xié)議標(biāo)準(zhǔn)是1.1版本,于1997年1月通過(guò)RFC 2068發(fā)布聪铺,然后又于2015年5月通過(guò)RFC 7540正式發(fā)布了HTTP/2標(biāo)準(zhǔn),最新的標(biāo)準(zhǔn)是HTTP/3萄窜,通過(guò)2022年6月6日的RFC 9114正式發(fā)布铃剔。

鴻蒙API內(nèi)置了對(duì)HTTP協(xié)議客戶端的支持撒桨,遺憾的是目前(API 9,包括API 10键兜、11)還不支持服務(wù)端(倒是可以在API 10或更高版本中通過(guò)TCP Server自行實(shí)現(xiàn)一個(gè))凤类,本文將講解HTTP客戶端相關(guān)方法的使用。

2. HttpRequest的常用方法

鴻蒙封裝的HTTP操作類位于模塊http中普气,使用如下的方式導(dǎo)入:

import http from '@ohos.net.http';

http模塊包括多個(gè)http請(qǐng)求相關(guān)方法谜疤,就本文而言,重點(diǎn)需要掌握的是如下兩個(gè):

1)createHttp(): HttpRequest

創(chuàng)建一個(gè)HttpRequest對(duì)象,每一個(gè)HTTP請(qǐng)求都需要有一個(gè)獨(dú)立的HttpRequest對(duì)象现诀,多個(gè)請(qǐng)求就要?jiǎng)?chuàng)建多個(gè)對(duì)象夷磕,最多創(chuàng)建100個(gè)。

2)request(url: string, options? : HttpRequestOptions): Promise<HttpResponse>

根據(jù)URL地址仔沿,發(fā)起HTTP網(wǎng)絡(luò)請(qǐng)求坐桩,使用Promise方式作為異步方法,其中參數(shù)url為發(fā)起網(wǎng)絡(luò)請(qǐng)求的URL地址于未,options為發(fā)起請(qǐng)求的可選參數(shù)撕攒,包括請(qǐng)求的方法、額外數(shù)據(jù)烘浦、希望的返回值類型抖坪、請(qǐng)求頭等信息,詳細(xì)的可以參考官方文檔闷叉。

3. HTTP模擬登錄示例

為演示HTTP模擬登錄擦俐,假設(shè)我們有這樣一個(gè)網(wǎng)站,訪問(wèn)該網(wǎng)站時(shí)如果沒(méi)有登錄握侧,會(huì)被重定向到登錄頁(yè)面蚯瞧,如圖所示:

image.png

如果成功登錄后,會(huì)重定向到首頁(yè)品擎,如圖所示埋合,這里會(huì)出現(xiàn)下載列表:

image.png

我們要實(shí)現(xiàn)的示例就是模擬這個(gè)登錄過(guò)程,從而可以得到首頁(yè)登錄后的內(nèi)容萄传。

本示例運(yùn)行后的頁(yè)面如圖所示:

image.png

單擊“請(qǐng)求”按鈕可以模擬沒(méi)有登錄直接訪問(wèn)首頁(yè)的情況甚颂,單擊“登錄”按鈕就是模擬登錄,

下面詳細(xì)介紹創(chuàng)建該應(yīng)用的步驟秀菱。

步驟1:創(chuàng)建Empty Ability項(xiàng)目振诬。

步驟2:在module.json5配置文件加上對(duì)權(quán)限的聲明:

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

這里添加了訪問(wèn)互聯(lián)網(wǎng)的權(quán)限。

步驟3:在Index.ets文件里添加如下的代碼:

import http from '@ohos.net.http';
import util from '@ohos.util';

@Entry
@Component
struct Index {
  //連接衍菱、通訊歷史記錄
  @State msgHistory: string = ''
  //首頁(yè)地址
  @State homePageUrl: string = "http://192.168.100.100:8081/index"
  //登錄地址
  @State loginUrl: string = "http://192.168.100.100:8081/auth"
  //用戶名
  @State loginName: string = "zhanglei"
  //密碼
  @State passwd: string = "cangjie"
  scroller: Scroller = new Scroller()

  build() {
    Row() {
      Column() {
        Text("模擬登錄示例")
          .fontSize(14)
          .fontWeight(FontWeight.Bold)
          .width('100%')
          .textAlign(TextAlign.Center)
          .padding(10)

        Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
          Text("首頁(yè)地址:")
            .fontSize(14)
            .width(80)
            .flexGrow(0)

          TextInput({ text: this.homePageUrl })
            .onChange((value) => {
              this.homePageUrl = value
            })
            .width(110)
            .fontSize(11)
            .flexGrow(1)

          Button("請(qǐng)求")
            .onClick(() => {
              this.requestHomePage()
            })
            .width(70)
            .fontSize(14)
            .flexGrow(0)
        }
        .width('100%')
        .padding(10)

        Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
          Text("用戶名:")
            .fontSize(14)
            .width(80)
            .flexGrow(0)

          TextInput({ text: this.loginName })
            .onChange((value) => {
              this.loginName = value
            })
            .width(110)
            .fontSize(11)
            .flexGrow(1)

          Text("密碼:")
            .fontSize(14)
            .width(60)
            .flexGrow(0)

          TextInput({ text: this.passwd })
            .onChange((value) => {
              this.passwd = value
            })
            .type(InputType.Password)
            .width(100)
            .fontSize(11)
            .flexGrow(1)
        }
        .width('100%')
        .padding(10)

        Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
          Text("登錄地址:")
            .fontSize(14)
            .width(80)
            .flexGrow(0)

          TextInput({ text: this.loginUrl })
            .onChange((value) => {
              this.loginUrl = value
            })
            .width(100)
            .fontSize(11)
            .flexGrow(1)
          Button("登錄")
            .onClick(() => {
              this.login()
            })
            .width(70)
            .fontSize(14)
            .flexGrow(0)
        }
        .width('100%')
        .padding(10)

        Scroll(this.scroller) {
          Text(this.msgHistory)
            .textAlign(TextAlign.Start)
            .padding(10)
            .width('100%')
            .backgroundColor(0xeeeeee)
        }
        .align(Alignment.Top)
        .backgroundColor(0xeeeeee)
        .height(300)
        .flexGrow(1)
        .scrollable(ScrollDirection.Vertical)
        .scrollBar(BarState.On)
        .scrollBarWidth(20)
      }
      .width('100%')
      .justifyContent(FlexAlign.Start)
      .height('100%')
    }
    .height('100%')
  }

  //請(qǐng)求首頁(yè)
  requestHomePage() {
    //http請(qǐng)求對(duì)象
    let httpRequest = http.createHttp();

    httpRequest.request(this.homePageUrl)
      .then((resp) => {
        this.msgHistory += "響應(yīng)碼:" + resp.responseCode + "\r\n"
        this.msgHistory += resp.result + "\r\n"
      })
      .catch((e) => {
        this.msgHistory += "請(qǐng)求失敻厦础:" + e.message + "\r\n"
      })
  }

  //模擬登錄
  login() {
    //http請(qǐng)求對(duì)象
    let httpRequest = http.createHttp();
    //請(qǐng)求的登錄名和密碼參數(shù)
    let params = "username=" + this.loginName + "&password=" + this.passwd

    let opt: http.HttpRequestOptions = {
      method: http.RequestMethod.POST,
      extraData: params,
      header: {'Content-Type': 'application/x-www-form-urlencoded' },
      expectDataType: http.HttpDataType.STRING
    }

    httpRequest.request(this.loginUrl, opt)
      .then((resp) => {
        this.msgHistory += "響應(yīng)碼:" + resp.responseCode + "\r\n"
        this.msgHistory += resp.result + "\r\n"
      })
      .catch((e) => {
        this.msgHistory += "請(qǐng)求失敗:" + e.message + "\r\n"
      })
  }
}

步驟4:編譯運(yùn)行脊串,可以使用模擬器或者真機(jī)辫呻。

步驟5:配置網(wǎng)站首頁(yè)地址和登錄地址清钥,然后單擊“請(qǐng)求”按鈕,頁(yè)面如圖所示:

image.png

可以看到放闺,被重定向到了登錄頁(yè)面循捺。

然后單擊“登錄”按鈕,界面如圖所示:

image.png

此時(shí)已經(jīng)成功登錄雄人,可以看到下載文件信息。

這樣念赶,就成功模擬了HTTP客戶端的登錄础钠。

(本文作者原創(chuàng),除非明確授權(quán)禁止轉(zhuǎn)載)

本文源碼地址:

https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/http/SimulateLogin

本系列源碼地址:

https://gitee.com/zl3624/harmonyos_network_samples

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叉谜,一起剝皮案震驚了整個(gè)濱河市旗吁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌停局,老刑警劉巖很钓,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異董栽,居然都是意外死亡码倦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)锭碳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袁稽,“玉大人,你說(shuō)我怎么就攤上這事擒抛⊥破” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵歧沪,是天一觀的道長(zhǎng)歹撒。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诊胞,這世上最難降的妖魔是什么暖夭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮厢钧,結(jié)果婚禮上鳞尔,老公的妹妹穿的比我還像新娘。我一直安慰自己早直,他們只是感情好寥假,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著霞扬,像睡著了一般糕韧。 火紅的嫁衣襯著肌膚如雪枫振。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,775評(píng)論 1 307
  • 那天萤彩,我揣著相機(jī)與錄音粪滤,去河邊找鬼。 笑死雀扶,一個(gè)胖子當(dāng)著我的面吹牛杖小,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播愚墓,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼予权,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了浪册?” 一聲冷哼從身側(cè)響起扫腺,我...
    開(kāi)封第一講書(shū)人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎村象,沒(méi)想到半個(gè)月后笆环,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厚者,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年躁劣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籍救。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡习绢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蝙昙,到底是詐尸還是另有隱情闪萄,我是刑警寧澤,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布奇颠,位于F島的核電站败去,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏烈拒。R本人自食惡果不足惜圆裕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荆几。 院中可真熱鬧吓妆,春花似錦、人聲如沸吨铸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)诞吱。三九已至舟奠,卻和暖如春竭缝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沼瘫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工抬纸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耿戚。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓湿故,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親膜蛔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晓锻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容