【中秋國慶不斷更】HarmonyOS網路管理開發—HTTP與WebSocket

HarmonyOS開發者社群發表於2023-10-04

一、網路管理開發概述

網路管理模組主要提供以下功能:

●  HTTP資料請求 :透過HTTP發起一個資料請求。

●  WebSocket連線 :使用WebSocket建立伺服器與客戶端的雙向連線。

●  Socket連線 :透過Socket進行資料傳輸。

約束與限制

使用網路管理模組的相關功能時,需要請求相應的許可權。

許可權名

說明

ohos.permission.GET_NETWORK_INFO

獲取網路連線資訊。

ohos.permission.SET_NETWORK_INFO

修改網路連線狀態。

ohos.permission.INTERNET

允許程式開啟網路套接字,進行網路連線。

二、HTTP資料請求

場景介紹

應用透過HTTP發起一個資料請求,支援常見的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。

介面說明

HTTP資料請求功能主要由http模組提供。

使用該功能需要申請ohos.permission.INTERNET許可權。

許可權申請請參考 訪問控制(許可權)開發指導

涉及的介面如下表,具體的介面說明請參考 API文件

介面名

功能描述

createHttp()

建立一個http請求。

request()

根據URL地址,發起HTTP網路請求。

destroy()

中斷請求任務。

on(type: 'headersReceive')

訂閱HTTP Response Header 事件。

off(type: 'headersReceive')

取消訂閱HTTP Response Header 事件。

once('headersReceive') 8+

訂閱HTTP Response Header 事件,但是隻觸發一次。

request介面開發步驟

1.      從@ohos.net.http.d.ts中匯入http名稱空間。

2.      呼叫createHttp()方法,建立一個HttpRequest物件。

3.      呼叫該物件的on()方法,訂閱http響應頭事件,此介面會比request請求先返回。可以根據業務需要訂閱此訊息。

4.      呼叫該物件的request()方法,傳入http請求的url地址和可選引數,發起網路請求。

5.      按照實際業務需要,解析返回結果。

6.      呼叫該物件的off()方法,取消訂閱http響應頭事件。

7.      當該請求使用完畢時,呼叫destroy()方法主動銷燬。

// 引入包名
import http from '@ohos.net.http';
// 每一個httpRequest對應一個HTTP請求任務,不可複用
let httpRequest = http.createHttp();
// 用於訂閱HTTP響應頭,此介面會比request請求先返回。可以根據業務需要訂閱此訊息
// 從API 8開始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
    // 填寫HTTP請求的URL地址,可以帶引數也可以不帶引數。URL地址需要開發者自定義。請求的引數可以在extraData中指定
    "EXAMPLE_URL",
    {
        method: http.RequestMethod.POST, // 可選,預設為http.RequestMethod.GET
        // 開發者根據自身業務需要新增header欄位
        header: {
            'Content-Type': 'application/json'
        },
        // 當使用POST請求時此欄位用於傳遞內容
        extraData: {
            "data": "data to send",
        },
        expectDataType: http.HttpDataType.STRING, // 可選,指定返回資料的型別
        usingCache: true, // 可選,預設為true
        priority: 1, // 可選,預設為1
        connectTimeout: 60000, // 可選,預設為60000ms
        readTimeout: 60000, // 可選,預設為60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可選,協議型別預設值由系統自動指定
    }, (err, data) => {
        if (!err) {
            // data.result為HTTP響應內容,可根據業務需要進行解析
            console.info('Result:' + JSON.stringify(data.result));
            console.info('code:' + JSON.stringify(data.responseCode));
            // data.header為HTTP響應頭,可根據業務需要進行解析
            console.info('header:' + JSON.stringify(data.header));
            console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
        } else {
            console.info('error:' + JSON.stringify(err));
            // 取消訂閱HTTP響應頭事件
            httpRequest.off('headersReceive');
            // 當該請求使用完畢時,呼叫destroy方法主動銷燬
            httpRequest.destroy();
        }
    }
);

三、WebSocket連線

場景介紹

使用WebSocket建立伺服器與客戶端的雙向連線,需要先透過createWebSocket()方法建立WebSocket物件,然後透過connect()方法連線到伺服器。當連線成功後,客戶端會收到open事件的回撥,之後客戶端就可以透過send()方法與伺服器進行通訊。當伺服器發資訊給客戶端時,客戶端會收到message事件的回撥。當客戶端不要此連線時,可以透過呼叫close()方法主動斷開連線,之後客戶端會收到close事件的回撥。

若在上述任一過程中發生錯誤,客戶端會收到error事件的回撥。

介面說明

WebSocket連線功能主要由webSocket模組提供。使用該功能需要申請ohos.permission.INTERNET許可權。具體介面說明如下表。

介面名

功能描述

createWebSocket()

建立一個WebSocket連線。

connect()

根據URL地址,建立一個WebSocket連線。

send()

透過WebSocket連線傳送資料。

close()

關閉WebSocket連線。

on(type: 'open')

訂閱WebSocket的開啟事件。

off(type: 'open')

取消訂閱WebSocket的開啟事件。

on(type: 'message')

訂閱WebSocket的接收到伺服器訊息事件。

off(type: 'message')

取消訂閱WebSocket的接收到伺服器訊息事件。

on(type: 'close')

訂閱WebSocket的關閉事件。

off(type: 'close')

取消訂閱WebSocket的關閉事件

on(type: 'error')

訂閱WebSocket的Error事件。

off(type: 'error')

取消訂閱WebSocket的Error事件。

開發步驟

1.      匯入需要的webSocket模組。

2.      建立一個WebSocket連線,返回一個WebSocket物件。

3.      (可選)訂閱WebSocket的開啟、訊息接收、關閉、Error事件。

4.      根據URL地址,發起WebSocket連線。

5.      使用完WebSocket連線之後,主動斷開連線。

import webSocket from '@ohos.net.webSocket';
var defaultIpAddress = "ws://";
let ws = webSocket.createWebSocket();
ws.on('open', (err, value) => {
    console.log("on open, status:" + JSON.stringify(value));
    // 當收到on('open')事件時,可以透過send()方法與伺服器進行通訊
    ws.send("Hello, server!", (err, value) => {
        if (!err) {
            console.log("Message sent successfully");
        } else {
            console.log("Failed to send the message. Err:" + JSON.stringify(err));
        }
    });
});
ws.on('message', (err, value) => {
    console.log("on message, message:" + value);
    // 當收到伺服器的`bye`訊息時(此訊息欄位僅為示意,具體欄位需要與伺服器協商),主動斷開連線
    if (value === 'bye') {
        ws.close((err, value) => {
            if (!err) {
                console.log("Connection closed successfully");
            } else {
                console.log("Failed to close the connection. Err: " + JSON.stringify(err));
            }
        });
    }
});
ws.on('close', (err, value) => {
    console.log("on close, code is " + value.code + ", reason is " + value.reason);
});
ws.on('error', (err) => {
    console.log("on error, error:" + JSON.stringify(err));
});
ws.connect(defaultIpAddress, (err, value) => {
    if (!err) {
        console.log("Connected successfully");
    } else {
        console.log("Connection failed. Err:" + JSON.stringify(err));
    }
});


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70009402/viewspace-2986352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章