node使用request請(qǐng)求的方法
近期使用node做服務(wù)端渲染,作為中間層需要請(qǐng)求后端接口,需要封裝服務(wù)端的請(qǐng)求,接下來來了解下如何使用 request。
基本使用
const request = require('request')
引入這個(gè)包就可以開始使用了,最簡(jiǎn)單的使用方式就是 request(url) 就可以想指定的地址發(fā)起一個(gè) get 請(qǐng)求。 從這里我們可以看出 request 暴露出來的就是一個(gè)函數(shù)。其實(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)接收三個(gè)函數(shù),并且第一個(gè)參數(shù)值必須存在,request的傳參方式也有很多種,本身做了很多支持的處理,來看看它支持的傳參數(shù)方式。
入?yún)⒏袷?/strong>
url 必填,可以單獨(dú)放在第一個(gè)參數(shù),或者作為 option 的屬性之一。其他都是可選。
// 方式一
request(url,options,callback)
// 方式二
let options = {
url // 必填
}
request(options,callback)
簡(jiǎn)寫方式
// 方式一
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)部的實(shí)現(xiàn)方式
源碼
下面代碼可以看出,request 對(duì)參數(shù)類型進(jìn)行類型判斷來采用不同的合并方式,最終 return 的params要求就是要包含url請(qǐng)求地址。
function initParams (uri, options, callback) {
// 處理沒有傳 options 的情況
if (typeof options === 'function') {
callback = options
}
var params = {}
if (typeof options === 'object') {
extend(params, options, {uri: uri})
// 傳遞的 url 最終也會(huì)被合并到 pramas 上
// 并且如果你在 options 傳遞了 uri 會(huì)被第一參數(shù)覆蓋,優(yōu)先級(jí)以 第一個(gè)入?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)
}
})
})
}
// 使用,只傳遞了接口部分最終會(huì)拼接成 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ù)類型的請(qǐng)求及 debug
為了模擬node服務(wù)端請(qǐng)求后端的場(chǎng)景,啟動(dòng)兩個(gè)node服務(wù) ,一個(gè)作為請(qǐng)求方模擬(中間層),另一個(gè)作為后端。另外通過 postman 來發(fā)起客戶端的請(qǐng)求。關(guān)于數(shù)據(jù)的驗(yàn)證可以使用 vscode 的 debug 功能 也可以開啟 pm2 log 來驗(yàn)證請(qǐng)求的參數(shù)。
接下來看下 post 不同格式的請(qǐng)求方式的設(shè)置,不同與 axios , fetch 。request對(duì)于不同請(qǐng)求方式的數(shù)據(jù)接收的字段是不同的??梢酝ㄟ^ body、form、formData 來接收。get的請(qǐng)求都是通過 application/x-www-form-urlencoded 格式來傳遞數(shù)據(jù)的,所以這里暫不舉例。
application/x-www-form-urlencoded
通過 forms字段 來接收入?yún)?,方法如下,直接將傳入的參?shù)對(duì)象傳遞給 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 有個(gè)debug 模式,通過 request.debug = true 開啟,為了查看debug信息,使用 pm2 start app.js --watch 啟動(dòng)項(xiàng)目,然后 pm2 log 來查看debug信息。紅色代表中間層的log,綠色代表后端的log
使用 node debug 查看接收到的 request.body是后端接收到的值 request.header是接收到的請(qǐng)求 content-type
都會(huì)將入?yún)鬟f到 body 這個(gè)字段上
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 , 我們并沒有手動(dòng)的去設(shè)置請(qǐng)求的 content-type 會(huì)自動(dòng)添加上。
下面代碼會(huì)將接收到到文件流寫入到后端local。可以看到 icon-arrow.jpg 已經(jīng)成功的從中間層發(fā)送到后端
application/json
將參數(shù)通過 body 傳遞,并且設(shè)置 json為ture,那么請(qǐng)求時(shí)會(huì)自動(dòng)將 content-type 設(shè)置為 application/json 并且將傳遞給 body 的對(duì)象轉(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號(hào)來區(qū)分當(dāng)前進(jìn)程,
可以通過 pm2 start app.js --name 請(qǐng)求端 來定義進(jìn)程名稱
最后
關(guān)于 reqeust 也是剛剛使用,有好的使用案例可以在評(píng)論區(qū)分享,值得優(yōu)化的地方可以留言給我。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:微信小程序跨頁面數(shù)據(jù)傳遞事件響應(yīng)實(shí)現(xiàn)過程解析
欄 目:JavaScript
下一篇:js通過循環(huán)多張圖片實(shí)現(xiàn)動(dòng)畫效果
本文標(biāo)題:node使用request請(qǐng)求的方法
本文地址:http://www.jygsgssxh.com/a1/JavaScript/9457.html
您可能感興趣的文章
- 04-02包含javascript舍的詞條
- 01-10使用webpack/gulp構(gòu)建TypeScript項(xiàng)目的方法示例
- 01-10使用JS來動(dòng)態(tài)操作css的幾種方法
- 01-10在Vue項(xiàng)目中使用Typescript的實(shí)現(xiàn)
- 01-10Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡(jiǎn)單方法
- 01-10echarts實(shí)現(xiàn)折線圖的拖拽效果
- 01-10JS數(shù)據(jù)類型STRING使用實(shí)例解析
- 01-10angularjs模態(tài)框的使用代碼實(shí)例
- 01-10使用JavaScript計(jì)算前一天和后一天的思路詳解
- 01-10Vue+Node服務(wù)器查詢Mongo數(shù)據(jù)庫及頁面數(shù)據(jù)傳遞操作實(shí)例分析


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02javascript點(diǎn)線,點(diǎn)線的代碼
- 04-02javascript潛力,javascript強(qiáng)大嗎
- 04-02javascript替換字符串,js字符串的替換
- 04-02javascript移出,js 移入移出
- 04-02包含javascript舍的詞條
- 04-02javascript并行,深入理解并行編程 豆瓣
- 04-02javascript匿名,js匿名方法
- 04-02javascript警報(bào),JavaScript警告
- 04-02javascript遮蓋,JavaScript遮蓋PC端頁面
- 04-02javascript前身,javascript的前身
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10delphi制作wav文件的方法


