node使用request請求的方法
近期使用node做服務(wù)端渲染,作為中間層需要請求后端接口,需要封裝服務(wù)端的請求,接下來來了解下如何使用 request。
基本使用
const request = require('request')
引入這個包就可以開始使用了,最簡單的使用方式就是 request(url) 就可以想指定的地址發(fā)起一個 get 請求。 從這里我們可以看出 request 暴露出來的就是一個函數(shù)。其實它內(nèi)部的結(jié)構(gòu)如下
function request (uri, options, callback) { if (typeof uri === 'undefined') { throw new Error('undefined is not a valid uri or options object.') } var params = initParams(uri, options, callback) if (params.method === 'HEAD' && paramsHaveRequestBody(params)) { throw new Error('HTTP HEAD requests MUST NOT include a request body.') } return new request.Request(params) }
可以看出它默認(rèn)接收三個函數(shù),并且第一個參數(shù)值必須存在,request的傳參方式也有很多種,本身做了很多支持的處理,來看看它支持的傳參數(shù)方式。
入?yún)⒏袷?/strong>
url 必填,可以單獨放在第一個參數(shù),或者作為 option 的屬性之一。其他都是可選。
// 方式一 request(url,options,callback) // 方式二 let options = { url // 必填 } request(options,callback)
簡寫方式
// 方式一 request.get(url,options,callback) // 方式二 let options = { url // 必填 } request.get(options,callback) // 方式一 request.post(url,options,callback) // 方式二 let options = { url } request.post(options,callback)
為啥 request 支持這么多種傳參數(shù)方式。來看看它內(nèi)部的實現(xiàn)方式
源碼
下面代碼可以看出,request 對參數(shù)類型進(jìn)行類型判斷來采用不同的合并方式,最終 return 的params要求就是要包含url請求地址。
function initParams (uri, options, callback) { // 處理沒有傳 options 的情況 if (typeof options === 'function') { callback = options } var params = {} if (typeof options === 'object') { extend(params, options, {uri: uri}) // 傳遞的 url 最終也會被合并到 pramas 上 // 并且如果你在 options 傳遞了 uri 會被第一參數(shù)覆蓋,優(yōu)先級以 第一個入?yún)ri為準(zhǔn) } else if (typeof uri === 'string') { extend(params, {uri: uri}) } else { // 處理第一參數(shù)不是url的情況 extend(params, uri) } params.callback = callback || params.callback return params }
常用字段
request(options,callback) 提供 baseUrl 來統(tǒng)一設(shè)置域名部分及公共部分。
// 定義了 baseUrl 后只需要傳遞接口 api 即可 function fetchPost(path,params){ return new Promise( (resolve,reject)=>{ request.post(path,{ baseUrl:"http://localhost:9000/react/", },function(err, httpResponse, body){ if(err){ reject(err) }else{ resolve(body) } }) }) } // 使用,只傳遞了接口部分最終會拼接成 http://localhost:9000/react/c-request router.get('/c-request',async ctx=>{ let res = await fetchPost('request-header',{value:1,name:'dd'}) ctx.body = res })
reqeust 不同數(shù)據(jù)類型的請求及 debug
為了模擬node服務(wù)端請求后端的場景,啟動兩個node服務(wù) ,一個作為請求方模擬(中間層),另一個作為后端。另外通過 postman 來發(fā)起客戶端的請求。關(guān)于數(shù)據(jù)的驗證可以使用 vscode 的 debug 功能 也可以開啟 pm2 log 來驗證請求的參數(shù)。
接下來看下 post 不同格式的請求方式的設(shè)置,不同與 axios , fetch 。request對于不同請求方式的數(shù)據(jù)接收的字段是不同的??梢酝ㄟ^ body、form、formData 來接收。get的請求都是通過 application/x-www-form-urlencoded 格式來傳遞數(shù)據(jù)的,所以這里暫不舉例。
application/x-www-form-urlencoded
通過 forms字段
來接收入?yún)?,方法如下,直接將傳入的參?shù)對象傳遞給 form 即可。
function fetchPost(path,params){ return new Promise( (resolve,reject)=>{ request.debug = true request.post(path,{ form:params },function(err, httpResponse, body){ if(err){ reject(err) }else{ resolve(body) } }) }) }
request 有個debug 模式,通過 request.debug = true
開啟,為了查看debug信息,使用 pm2 start app.js --watch
啟動項目,然后 pm2 log
來查看debug信息。紅色代表中間層的log,綠色代表后端的log
使用 node debug 查看接收到的 request.body是后端接收到的值 request.header是接收到的請求 content-type
都會將入?yún)鬟f到 body 這個字段上
form-data 文件上傳
通過 formData
來傳遞文件,代碼如下:使用 fs.createReadStream 去拿到中間層的文件,然后通過 formData 方式發(fā)送給后端。
function fetchPost(path,params){ return new Promise( (resolve,reject)=>{ let formData = { file:fs.createReadStream(__dirname+'/../static/images/icon-arrow.png') } request.debug = true request.post(path,{ formData },function(err, httpResponse, body){ if(err){ reject(err) }else{ resolve(body) } }) }) }
可以看到后端接收到到 content-type 為 multipart/form-data , 我們并沒有手動的去設(shè)置請求的 content-type 會自動添加上。
下面代碼會將接收到到文件流寫入到后端local??梢钥吹?icon-arrow.jpg 已經(jīng)成功的從中間層發(fā)送到后端
application/json
將參數(shù)通過 body 傳遞,并且設(shè)置 json為ture,那么請求時會自動將 content-type 設(shè)置為 application/json 并且將傳遞給 body 的對象轉(zhuǎn)義為 JSON
function fetchPost(path,params){ return new Promise( (resolve,reject)=>{ request.debug = true console.log('*'.repeat(40)); request.post(path,{ baseUrl:"http://localhost:9000/react/", body:params, json:true },function(err, httpResponse, body){ if(err){ reject(err) }else{ resolve(body) } }) }) }
header
request.post(path,{ form:params, headers:{ // 'content-type':'application/json', // ... 任意其他字段 name:'dd', agent:'request' } })
通過id號來區(qū)分當(dāng)前進(jìn)程,
可以通過 pm2 start app.js --name 請求端 來定義進(jìn)程名稱
最后
關(guān)于 reqeust 也是剛剛使用,有好的使用案例可以在評論區(qū)分享,值得優(yōu)化的地方可以留言給我。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解使用Node.js 將txt文件轉(zhuǎn)為Excel文件
這篇文章主要介紹了詳解使用Node.js 將txt文件轉(zhuǎn)為Excel文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-07-07async/await與promise(nodejs中的異步操作問題)
這篇文章主要介紹了async/await與promise(nodejs中的異步操作問題),非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-03-03Node.js v8.0.0正式發(fā)布!看看帶來了哪些主要新特性
Node.js v8.0.0 已正式發(fā)布。v8.0.0 是下一個主要的版本,帶來了一系列重大的變化和新功能,內(nèi)容十分多!下面這篇文章主要帶著大家一起看看Node.js v8.0.0帶來了哪些主要新特性,需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06node.js 基于cheerio的爬蟲工具的實現(xiàn)(需要登錄權(quán)限的爬蟲工具)
這篇文章主要介紹了node.js 基于cheerio的爬蟲工具的實現(xiàn)(需要登錄權(quán)限的爬蟲工具) ,需要的朋友可以參考下2019-04-04npm報錯:無法將"npm"項識別為cmdlet、函數(shù)、腳本文件或可運行程序的名稱
這篇文章主要給大家介紹了關(guān)于npm報錯:無法將"npm"項識別為cmdlet、函數(shù)、腳本文件或可運行程序的名稱的相關(guān)資料,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02