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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
