近期使用node做服務(wù)端渲染,作為中間層需要請求后端接口,需要封裝服務(wù)端的請求,接下來來了解下如何使用 request。
創(chuàng)新互聯(lián)專注于坡頭網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供坡頭營銷型網(wǎng)站建設(shè),坡頭網(wǎng)站制作、坡頭網(wǎng)頁設(shè)計、坡頭網(wǎng)站官網(wǎng)定制、微信小程序開發(fā)服務(wù),打造坡頭網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供坡頭網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
基本使用
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) }
可以看出它默認接收三個函數(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ù)類型進行類型判斷來采用不同的合并方式,最終 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為準 } 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ū)分當前進程,
可以通過 pm2 start app.js --name 請求端 來定義進程名稱
最后
關(guān)于 reqeust 也是剛剛使用,有好的使用案例可以在評論區(qū)分享,值得優(yōu)化的地方可以留言給我。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當前文章:node使用request請求的方法
標題URL:http://aaarwkj.com/article4/iggiie.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、、全網(wǎng)營銷推廣、軟件開發(fā)、手機網(wǎng)站建設(shè)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)