node的Request請求庫被廢棄的替代庫推薦got、axios
阿新 • • 發佈:2020-08-13
Request 在 2020.2.11 就被廢棄了, 幾乎接觸過Node的人都接觸過Request, 通過看到一個個庫的廢棄, 停止支援以及轉手, 我們可以看到開源事業的艱辛。
一、替代庫got
當然, 既然Request廢棄了, 我們也得繼續找個靠譜的請求庫啦。那就是got
1、效能對比
下圖是官方文件中將 got
與 request
, node-fetch
, ky
, axios
, superagent
這幾個常用的HTTP請求庫功能上的對比, 可以看到got
的功能還算全面, 雖然不支援瀏覽器端使用。整體來說,還算不錯。
2、從 Request 遷移
你可能覺得遷移會很麻煩, 但是並不是。讓我們從Request的文件中拿出第一個例子
const request = require('request');
request('https://google.com', (error, response, body) => {
console.log('error:', error);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
});
// got
const got = require('got');
(async () => {
try {
const response = await got('https://google.com');
console.log('statusCode:', response.statusCode);
console.log('body:', response.body);
} catch (error) {
console.log('error:', error);
}
})();
3、具體用法看官方文件,這裡擷取一些
重大變化
json
選項不是boolean
型別, 而是Object
型別. 他將被序列化並當作body使用.form
選項是Object
型別. 他可以是一個普通物件或者一個form-data
例項.- 沒有
oauth
/hawk
/aws
/httpSignature
選項. 標記請求, 你需要建立一個自定義例項. - 沒有
agentClass
/agentOptions
/pool
選項. - 沒有
forever
選項. 你需要使用forever-agent. - 沒有
proxy
選項. 你需要使用pass a custom agent. - 沒有
auth
選項. 你需要使用username
/password
代替. - 沒有
baseUrl
選項. 使用prefixUrl
代替, 如果不存在就用斜槓代替. 除非URL是一個例項, 否則它將始終是前置. - 沒有
removeRefererHeader
選項. 你可以移除 referer 頭 在beforeRequest
鉤子裡:
const gotInstance = got.extend({
hooks: {
beforeRequest: [
options => {
delete options.headers.referer;
}
]
}
});
gotInstance(url, options);
沒有 jsonReviver
/jsonReplacer
選項, 但是你可以使用鉤子來解決:
const gotInstance = got.extend({
hooks: {
init: [
options => {
if (options.jsonReplacer && options.json) {
options.body = JSON.stringify(options.json, options.jsonReplacer);
delete options.json;
}
}
],
beforeRequest: [
options => {
if (options.responseType === 'json' && options.jsonReviver) {
options.responseType = 'text';
options.customJsonResponse = true;
}
}
],
afterResponse: [
response => {
const {options} = response.request;
if (options.jsonReviver && options.customJsonResponse) {
response.body = JSON.parse(response.body, options.jsonReviver);
}
return response;
}
]
}
});
gotInstance(url, options);
鉤子是非常有用的, 不是嗎? 檢視更多 看看鉤子還能實現什麼.
關於流的更多資訊
讓我們快速看下 Request 的文件中的另一個示例:
http.createServer((request, response) => {
if (request.url === '/doodle.png') {
request.pipe(request('https://example.com/doodle.png')).pipe(response);
}
});
很酷的功能是, Request 可以代理請求頭和流, 當然Got也能做到:
const stream = require('stream');
const {promisify} = require('util');
const got = require('got');
const pipeline = promisify(stream.pipeline);
http.createServer(async (request, response) => {
if (request.url === '/doodle.png') {
// 當有人向我們的伺服器發出請求時,我們會收到一個body和一些請求頭.
// 這些被傳遞給Got. 代理將會將資料下載到我們伺服器,
// 所以你不必使用`response.writeHead(statusCode, headers)` 和 `response.end(body)`.
// 這些將自動完成.
await pipeline(
got.stream('https://example.com/doodle.png'),
response
);
}
});
一切都沒有真正改變. 只是記得使用 got.stream(url, options)
或者 got(url, {isStream: true, …})
. 僅此而已!
二、替代庫Axios
與瀏覽器端使用差不多,具體不多說
推薦這2款,感覺還不錯。