http-request.md 8.3 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8 9 10
# HTTP数据请求

## 场景介绍

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

## 接口说明

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

11
使用该功能需要申请ohos.permission.INTERNET权限。
Z
zengyawen 已提交
12

13 14
权限申请请参考[访问控制(权限)开发指导](../security/accesstoken-guidelines.md)

15
涉及的接口如下表,具体的接口说明请参考[API文档](../reference/apis/js-apis-http.md)
Z
zengyawen 已提交
16 17 18 19 20

| 接口名                                    | 功能描述                            |
| ----------------------------------------- | ----------------------------------- |
| createHttp()                              | 创建一个http请求。                  |
| request()                                 | 根据URL地址,发起HTTP网络请求。     |
Y
Yangys 已提交
21
| request2()<sup>10+</sup>                  | 根据URL地址,发起HTTP网络请求并返回流式响应|
Z
zengyawen 已提交
22
| destroy()                                 | 中断请求任务。                      |
23 24
| on(type: 'headersReceive')                | 订阅HTTP Response Header 事件。     |
| off(type: 'headersReceive')               | 取消订阅HTTP Response Header 事件。 |
Y
Yangys 已提交
25 26 27 28 29 30 31
| once\('headersReceive'\)<sup>8+</sup>     | 订阅HTTP Response Header 事件,但是只触发一次。|
| on\('dataReceive'\)<sup>10+</sup>         | 订阅HTTP流式响应数据接收事件。      |
| off\('dataReceive'\)<sup>10+</sup>        | 取消订阅HTTP流式响应数据接收事件。  |
| on\('dataEnd'\)<sup>10+</sup>             | 订阅HTTP流式响应数据接收完毕事件。  |
| off\('dataEnd'\)<sup>10+</sup>            | 取消订阅HTTP流式响应数据接收完毕事件。 |
| on\('dataProgress'\)<sup>10+</sup>        | 订阅HTTP流式响应数据接收进度事件。  |
| off\('dataProgress'\)<sup>10+</sup>       | 取消订阅HTTP流式响应数据接收进度事件。 |
Z
zengyawen 已提交
32

Y
Yangys 已提交
33
## request接口开发步骤
Z
zengyawen 已提交
34

Y
Yangys 已提交
35 36 37 38 39 40 41
1. 从@ohos.net.http.d.ts中导入http命名空间。
2. 调用createHttp()方法,创建一个HttpRequest对象。
3. 调用该对象的on()方法,订阅http响应头事件,此接口会比request请求先返回。可以根据业务需要订阅此消息。
4. 调用该对象的request()方法,传入http请求的url地址和可选参数,发起网络请求。
5. 按照实际业务需要,解析返回结果。
6. 调用该对象的off()方法,取消订阅http响应头事件。
7. 当该请求使用完毕时,调用destroy()方法主动销毁。
Z
zengyawen 已提交
42 43

```js
Y
Yangys 已提交
44
// 引入包名
Z
zengyawen 已提交
45 46
import http from '@ohos.net.http';

Y
Yangys 已提交
47
// 每一个httpRequest对应一个HTTP请求任务,不可复用
Z
zengyawen 已提交
48
let httpRequest = http.createHttp();
Y
Yangys 已提交
49
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
Z
zengyawen 已提交
50 51 52 53 54
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
Y
Yangys 已提交
55
    // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
Z
zengyawen 已提交
56 57 58 59 60 61 62 63 64 65 66
    "EXAMPLE_URL",
    {
        method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
        // 开发者根据自身业务需要添加header字段
        header: {
            'Content-Type': 'application/json'
        },
        // 当使用POST请求时此字段用于传递内容
        extraData: {
            "data": "data to send",
        },
Y
Yangys 已提交
67 68 69 70 71 72 73
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
        usingCache: true, // 可选,默认为true
        priority: 1, // 可选,默认为1
        connectTimeout: 60000, // 可选,默认为60000ms
        readTimeout: 60000, // 可选,默认为60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
        usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性
Z
zengyawen 已提交
74 75
    }, (err, data) => {
        if (!err) {
Y
Yangys 已提交
76 77 78 79
            // data.result为HTTP响应内容,可根据业务需要进行解析
            console.info('Result:' + JSON.stringify(data.result));
            console.info('code:' + JSON.stringify(data.responseCode));
            // data.header为HTTP响应头,可根据业务需要进行解析
Z
zengyawen 已提交
80
            console.info('header:' + JSON.stringify(data.header));
Y
Yangys 已提交
81
            console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
Z
zengyawen 已提交
82 83
        } else {
            console.info('error:' + JSON.stringify(err));
Y
Yangys 已提交
84 85
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
Y
Yangys 已提交
86
            // 当该请求使用完毕时,调用destroy方法主动销毁
Z
zengyawen 已提交
87 88 89 90 91
            httpRequest.destroy();
        }
    }
);
```
Z
sa  
zengyawen 已提交
92

Y
Yangys 已提交
93 94 95 96 97 98 99 100 101 102 103 104
## request2接口开发步骤

1. 从@ohos.net.http.d.ts中导入http命名空间。
2. 调用createHttp()方法,创建一个HttpRequest对象。
3. 调用该对象的on()方法,可以根据业务需要订阅HTTP响应头事件、HTTP流式响应数据接收事件、HTTP流式响应数据接收进度事件和HTTP流式响应数据接收完毕事件。
4. 调用该对象的request2()方法,传入http请求的url地址和可选参数,发起网络请求。
5. 按照实际业务需要,可以解析返回的响应码。
6. 调用该对象的off()方法,取消订阅相应事件。
7. 当该请求使用完毕时,调用destroy()方法主动销毁。

```js
// 引入包名
105
import http from '@ohos.net.http'
Y
Yangys 已提交
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164

// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头事件
httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
});
// 用于订阅HTTP流式响应数据接收事件
let res = '';
httpRequest.on('dataReceive', (data) => {
    res += data;
    console.info('res: ' + res);
});
// 用于订阅HTTP流式响应数据接收完毕事件
httpRequest.on('dataEnd', () => {
    console.info('No more data in response, data receive end');
});
// 用于订阅HTTP流式响应数据接收进度事件
httpRequest.on('dataProgress', (data) => {
    console.log("dataProgress receiveSize:" + data.receiveSize+ ", totalSize:" + data.totalSize);
});

httpRequest.request2(
    // 填写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) => {
            console.info('error:' + JSON.stringify(err));
            console.info('ResponseCode :' + JSON.stringify(data));
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
            // 取消订阅HTTP流式响应数据接收事件
            httpRequest.off('dataReceive');
            // 取消订阅HTTP流式响应数据接收进度事件
            httpRequest.off('dataProgress');
            // 取消订阅HTTP流式响应数据接收完毕事件
            httpRequest.off('dataEnd');
            // 当该请求使用完毕时,调用destroy方法主动销毁
            httpRequest.destroy();
        }
);

```

Z
sa  
zengyawen 已提交
165 166
## 相关实例
针对HTTP数据请求,有以下相关实例可供参考:
Z
zwx1094577 已提交
167
- [`Http:`数据请求(ArkTS)(API9))](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Connectivity/Http)
168
- [使用HTTP实现与服务端通信(ArkTS)(API9)](https://gitee.com/openharmony/codelabs/tree/master/NetworkManagement/SmartChatEtsOH)