>[success] # 发起http 请求
1. `http.request`是 Node.js 中用于发起 HTTP 请求的低级 API。`axios`库在 Node.js 环境下底层基于 Node.js 的`http`模块实现了发送 HTTP 请求的功能 ,在浏览器中,`axios`使用的是封装`xhr`;
`http.request(options[, callback])`方法中,`options`参数是一个 JSON 对象,用于指定请求的一些属性,包括:
* `protocol`:请求协议,默认为`'http:'`。
* `hostname`:请求主机名或 IP 地址。
* `port`:请求端口号,默认为`80`。
* `path`:请求路径,默认为`'/'`。
* `method`:请求方法,例如`'GET'`、`'POST'`等,默认为`'GET'`。
* `headers`:请求头,是一个对象,其中键值对分别表示请求头名称和值。
`callback`参数是一个回调函数,用于处理响应结果。回调函数有一个参数`response`,即响应对象,可以通过`response`对象获取一些响应信息和数据流。
~~~
const http = require('http');
const options = {
hostname: 'localhost',
port: 8080,
path: '/api/v1/login',
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
};
const req = http.request(options, (res) => {
console.log(`请求状态:${res.statusCode}`);
console.log(`响应头:${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`响应数据:${chunk}`);
});
res.on('end', () => {
console.log('响应数据接收完毕。');
});
});
req.on('error', (e) => {
console.error(`请求遇到问题:${e.message}`);
});
const postData = JSON.stringify({ username: 'admin', password: '123456' });
// 往请求体中写入数据
req.write(postData);
// `req.end()`方法提交请求
req.end();
~~~
* 案例二
~~~
// 1.使用http模块发送get请求
// http.get('http://localhost:8000', (res) => {
// // 从可读流中获取数据
// res.on('data', (data) => {
// const dataString = data.toString()
// const dataInfo = JSON.parse(dataString)
// console.log(dataInfo)
// })
// })
// 2.使用http模块发送post请求
const req = http.request({
method: 'POST',
hostname: 'localhost',
port: 8000
}, (res) => {
res.on('data', (data) => {
const dataString = data.toString()
const dataInfo = JSON.parse(dataString)
console.log(dataInfo)
})
})
// 必须调用end, 表示写入内容完成
req.end()
[TOC]
~~~
2. `http.request()`方法创建了一个 HTTP 请求对象`req`,并使用`req.write()`方法向请求主体中写入 JSON 数据,最后调用`req.end()`方法提交请求。可以看到,在通过`req.write()`方法写入数据后,数据会保存到请求主体中,并在发送请求时一起发送到服务器端。
>[danger] ##### 说明Content-Type
1. `'application/json'`作为`Content-Type`的值。如果 POST 的是表单数据或其他类型的数据,这个字段的值也会相应不同
2. 'Content-Type' 是 HTTP 协议中的一个重要字段,用于指示发送给接收者的实体的媒体类型。具体说,它告诉接收方发出请求或者响应的这个实体是有哪种 MIME 类型的数据。
3. MIME(Multipurpose Internet Mail Extensions)类型,是互联网上常用的一种数据格式标准。它定义了一组类型名称和相应的格式(Content-Type),供我们在互联网上交换不同类型的文件数据。
**常见的 MIME 类型包括**:
* text/plain:文本文件,没有格式控制。
* text/html:HTML 文件,可以包含 HTML 标签等富文本信息。
* application/json:JSON 格式数据,如 API 返回的数据。
* application/x-www-form-urlencoded:表单提交的数据,表示数据被编码成以'&' 分隔的键\-值对,同时以'=' 分隔键和值
* multipart/form-data:文件上传的数据。
当我们发送请求时,需要根据要发送的数据类型设置 'Content-Type' 字段。以 POST 表单请求为例,Content-Type 的数据类型通常是`application/x-www-form-urlencoded`或`multipart/form-data`。 对于`application/x-www-form-urlencoded`数据类型,数据将被编码成 key-value 的形式,如:
~~~
POST / HTTP/1.1
Host: example.com
Content-Type: application/x-www-form-urlencoded
message=Hello+World!
~~~
而`multipart/form-data`是用于发送带有文件的表单数据的常用数据格式,如:
~~~
POST /upload HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryxxxxxx
------WebKitFormBoundaryxxxxxx
Content-Disposition: form-data; name="title"
My Title
------WebKitFormBoundaryxxxxxx
Content-Disposition: form-data; name="description"
A simple description here
------WebKitFormBoundaryxxxxxx
Content-Disposition: form-data; name="file"; filename="test.txt"
Content-Type: text/plain
Here is some test text.
------WebKitFormBoundaryxxxxxx--
~~~
其中,`boundary`是分隔符,必须要在请求头中指定。
总之,了解 'Content-Type' 字段的作用和不同 MIME 类型的用途,可以帮助我们更好地使用 HTTP 协议来获取和发送数据。
- 基础
- 什么是Node.js
- 理解 I/O 模型
- 理解node 中 I/O
- 对比node 和java 使用场景
- node 模块管理
- 内置模块 -- buffer
- 内置模块 -- fs
- fs -- 文件描述符
- fs -- 打开文件 api
- fs -- 文件读取 api
- fs -- 文件写入 api
- fs -- 创建目录 api
- fs -- 读取文件目录结构 api
- fs -- 文件状态(信息) api
- fs -- 删除文件/目录 api
- fs -- 重命名 api
- fs -- 复制文件 api
- 内置模块 -- events
- 内置模块 -- stream
- 可读流 -- Readable
- 可写流 -- Writable
- Duplex
- Transform
- 内置模块 -- http
- http -- 从客户端发起
- http -- 从服务端发起
- 内置模块 -- url
- 网络开发