服务器之间请求是没有跨域限制的,我们可以利用node作为中间层,去请求别的服务器的接口,获取数据响应给自己定义的接口,实现转发。 目的:1 解决跨域问题,2 如果多个接口在不同的服务器上处理跨域比较麻烦,node作为中间层容易维护。 核心代码:利用http模块的get方法去请求数据 前端请求:
fetch('http://localhost:3000/api/getValue').then(response => {
return response.json()
}).then(res=>{
console.log(res)
})
node代理转发豆瓣的请求给前端,如果请求是https的,要引入https的模块
let https = require('https')
封装豆瓣请求
function httpGet(callback){
https.get('https://m.douban.com/j/puppy/frodo_landing?include=anony_home',(res)=>{
let data = ''
res.on('data',(chunk)=>{
data += chunk
})
res.on('end',()=>{
callback(data)
})
})
}
http.createServer((req,res)=>{
let data = url.parse(req.url,true)
res.writeHead(200,{
"Content-Type":"application/json;charset=utf-8",
"access-control-allow-origin":'*' // 设置cors头去解决跨域问题
})
if(data.pathname === '/api/getValue'){
httpGet((data)=>{
console.log(data)
res.end(data)
})
}else{
res.end("404")
}
}).listen(3000,()=>{
console.log('server run ...')
})
node之http的post请求
http还有post请求,语法上和http的get请求是不一样的。
- http的post请求的api为request,
- 第一个参数是配置对象,
hostname是主机名,不要带http或者https port因为是post,默认是443 path为请求的路径地址
let options = {
hostname:'m.xiaomiyoupin.com',
port:'443',
path:'/mtop/market/search/placeHolder',
method:'POST',
headers:{
"content-type":'application/json'
}
}
- 返回值是一个对象,通过这个request的返回值req进行请求
- 返回值req还要进行write去携带请求参数,通过end去结束
let req = https.request(options,(res)=>{
let data = ''
res.on('data',(chunk)=>{
data += chunk
})
res.on('end',()=>{
callback(data)
})
})
req.write(JSON.stringify([{},{"baseParam":{"ypClient":1}}]))
req.end()
|