>[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
- 網絡開發