# informat.http http请求

## 概述

使用`informat.http`对象进行HTTP网络请求。通过统一的informat.http.request请求后拿到response对象。

::: info

- 由于发起请求时可能会出现网络波动或被调用方服务异常导致调用失败，如常见404、502等HTTP状态码。
  因此在调用后请先获取对应状态码后再做后续业务处理。
- 部分调用服务后可能会重定向到另外一个网络地址，针对这种情况，可以在调用时将request对象中followRedirect设置为true来自动重定向到真正访问的网络地址，也可以在业务代码中自行处理
  :::

## request

发送请求

```javascript
informat.http.request(request)
```

| 参数      | 类型                                     | 描述   |
|---------|----------------------------------------|------|
| request | [HttpRequest](/guide/script/model.md#httprequest) | 请求对象 |

**返回值**
类型[HttpResponse](/guide/script/http.md#response)
返回http请求的内容

**示例**

```js
const req = {
    url: 'https://demo.api.com/api',
    method: 'POST',
    timeout: 1000,
    form: {
        'p1': 1,
        'p2': 'str'
    }
}
informat.http.request(req)
```

## Response

### statusCode

HTTP状态码

```js
response.statusCode()
```

**返回值**

类型`Integer`

### body

内容

```js
response.body()
```

**返回值**

类型`String`

### headers

获取http请求头

```js
response.headers()
```

**返回值**

类型`Object<String,String>`

### contentEncoding

返回的内容编码方式

```js
response.contentEncoding()
```

**返回值**

类型`String`

### contentLength

返回的内容长度

```js
response.contentLength()
```

**返回值**

类型`Integer`

### saveBodyAsFile

保存文件到本地

```js
response.saveBodyAsFile(path)
```

| 参数   | 类型       | 描述   |
|------|----------|------|
| path | `String` | 存储路径 |

### saveBodyAsStorage

保存文件到文件共享存储

```js
response.saveBodyAsStorage(path)
```

| 参数   | 类型       | 描述   |
|------|----------|------|
| path | `String` | 存储路径 |

### saveBodyAsAttachment

保存为附件对象

```js
response.saveBodyAsAttachment(tableKey, fieldKey, fileName)
```

| 方法       | 类型       | 描述     |
|----------|----------|--------|
| tableKey | `String` | 数据表标识符 |
| fieldKey | `String` | 字段标识符  |
| fileName | `String` | 文件名    |

## 示例

### 示例一：调用POST请求的例子

```js
const req = {
    url: 'https://demo.api.com/api',
    method: 'POST',
    timeout: 1000,
    form: {
        'p1': 1,
        'p2': 'str'
    }
}
const rsp = informat.http.request(req);
console.log(rsp.body());//请求结果
```

### 示例二：调用GET请求的例子

::: code-group

```javascript [调用示例一]
const req = {
    url: 'https://demo.api.com/api?a=zhangsan&b=lisi',
    method: 'GET',
    timeout: 1000,
}
const ctx = informat.http.request(req)
console.log(ctx.body(), '....') //请求结果
```

```javascript [调用示例二]
const req = {
    url: 'https://demo.api.com/api',
    method: 'GET',
    timeout: 1000,
    form: {
        a: 'zhangsan',
        b: 'lisi'
    }
}
const ctx = informat.http.request(req)
console.log(ctx.body(), '....') //请求结果
```

:::

### 示例三：下载远程文件后，存储到本地沙盒环境

```js
const req = {
    url: 'https://next.informat.cn/logo.png',
    followRedirect: true,
    maxRedirectCount: 10,
}
const rsp = informat.http.request(req);
rsp.saveBodyAsFile('logo.png');
```

### 示例四：下载远程文件后，存储到s3共享存储

```js
const req = {
    url: 'https://next.informat.cn/logo.png',
    followRedirect: true,
    maxRedirectCount: 10,
}
const rsp = informat.http.request(req);
rsp.saveBodyAsStorage('logo.png');
```

### 示例五：调用请求后上传文件至文件共享存储并保存为附件对象

```js
let req = {
    url: 'https://demo.api.com/api',
    followRedirect: true,
    maxRedirectCount: 10,
};
let rsp = informat.http.request(req);
const attachment = rsp.saveBodyAsAttachment('tableKey', 'fieldKey', 'demo.png');
// 保存为附件后 可以更新数据、插入数据等操作（tableKey与fieldKey需要保持一致）
const insertBean = {
    name: 'demo name',
    attachment: attachment,  // 如果是多选 需要用[] 包起来 例如: attachment: [attachment]
};
// 调用新增数据接口
informat.table.insert('tableKey', insertBean);
```

### 示例六：上传沙盒环境文件至第三方接口

```js
const req = {
    url: 'https://demo.api.com/api',
    method: 'POST',
    timeout: 5000,
    files: {
        file: 'demo.jpg'
    }
}
const resp = informat.http.request(req);
console.log(resp.statusCode());
console.log(resp.body());
```

### 示例七：上传文件共享存储文件至第三方接口

```js
const req = {
    url: 'https://demo.api.com/api',
    method: 'POST',
    timeout: 5000,
    storages: {
        file: 'demo.jpg'
    }
}
const resp = informat.http.request(req);
console.log(resp.statusCode());
console.log(resp.body());
```
