node使用request请求的方法
近期使用node做服务端渲染,作为中间层需要请求后端接口,需要封装服务端的请求,接下来来了解下如何使用request。
基本使用
constrequest=require('request')
引入这个包就可以开始使用了,最简单的使用方式就是request(url)就可以想指定的地址发起一个get请求。从这里我们可以看出request暴露出来的就是一个函数。其实它内部的结构如下
functionrequest(uri,options,callback){ if(typeofuri==='undefined'){ thrownewError('undefinedisnotavalidurioroptionsobject.') } varparams=initParams(uri,options,callback) if(params.method==='HEAD'&¶msHaveRequestBody(params)){ thrownewError('HTTPHEADrequestsMUSTNOTincludearequestbody.') } returnnewrequest.Request(params) }
可以看出它默认接收三个函数,并且第一个参数值必须存在,request的传参方式也有很多种,本身做了很多支持的处理,来看看它支持的传参数方式。
入参格式
url必填,可以单独放在第一个参数,或者作为option的属性之一。其他都是可选。
//方式一 request(url,options,callback) //方式二 letoptions={ url//必填 } request(options,callback)
简写方式
//方式一 request.get(url,options,callback) //方式二 letoptions={ url//必填 } request.get(options,callback) //方式一 request.post(url,options,callback) //方式二 letoptions={ url } request.post(options,callback)
为啥request支持这么多种传参数方式。来看看它内部的实现方式
源码
下面代码可以看出,request对参数类型进行类型判断来采用不同的合并方式,最终return的params要求就是要包含url请求地址。
functioninitParams(uri,options,callback){ //处理没有传options的情况 if(typeofoptions==='function'){ callback=options } varparams={} if(typeofoptions==='object'){ extend(params,options,{uri:uri}) //传递的url最终也会被合并到pramas上 //并且如果你在options传递了uri会被第一参数覆盖,优先级以第一个入参uri为准 }elseif(typeofuri==='string'){ extend(params,{uri:uri}) }else{ //处理第一参数不是url的情况 extend(params,uri) } params.callback=callback||params.callback returnparams }
常用字段
request(options,callback)提供baseUrl来统一设置域名部分及公共部分。
//定义了baseUrl后只需要传递接口api即可 functionfetchPost(path,params){ returnnewPromise((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',asyncctx=>{ letres=awaitfetchPost('request-header',{value:1,name:'dd'}) ctx.body=res })
reqeust不同数据类型的请求及debug
为了模拟node服务端请求后端的场景,启动两个node服务,一个作为请求方模拟(中间层),另一个作为后端。另外通过postman来发起客户端的请求。关于数据的验证可以使用vscode的debug功能也可以开启pm2log来验证请求的参数。
接下来看下post不同格式的请求方式的设置,不同与axios,fetch。request对于不同请求方式的数据接收的字段是不同的。可以通过body、form、formData来接收。get的请求都是通过application/x-www-form-urlencoded格式来传递数据的,所以这里暂不举例。
application/x-www-form-urlencoded
通过forms字段来接收入参,方法如下,直接将传入的参数对象传递给form即可。
functionfetchPost(path,params){ returnnewPromise((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信息,使用pm2startapp.js--watch启动项目,然后pm2log来查看debug信息。红色代表中间层的log,绿色代表后端的log
使用nodedebug查看接收到的request.body是后端接收到的值request.header是接收到的请求content-type
都会将入参传递到body这个字段上
form-data文件上传
通过formData来传递文件,代码如下:使用fs.createReadStream去拿到中间层的文件,然后通过formData方式发送给后端。
functionfetchPost(path,params){ returnnewPromise((resolve,reject)=>{ letformData={ 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,我们并没有手动的去设置请求的content-type会自动添加上。
下面代码会将接收到到文件流写入到后端local。可以看到icon-arrow.jpg已经成功的从中间层发送到后端
将参数通过body传递,并且设置json为ture,那么请求时会自动将content-type设置为application/json并且将传递给body的对象转义为JSON
functionfetchPost(path,params){ returnnewPromise((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号来区分当前进程,
可以通过pm2startapp.js--name请求端来定义进程名称
关于reqeust也是刚刚使用,有好的使用案例可以在评论区分享,值得优化的地方可以留言给我。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。