Nodejs学习(三)---开发接口

  • node处理http请求
  • 搭建开发环境
  • 开发接口

http请求概述

  • DNS解析,建立TCP连接,发送http请求。
  • server接收到http请求,处理,并返回。
  • 客户端接收到返回数据,处理数据(如渲染页面,js)

nodejs处理http请求

  • get请求和querystring
  • post请求和postdata
  • 路由

nodejs处理get请求

  • get请求,即客户端要向server端获取数据
  • 通过querystring来传递数据,如a.html?a=100&b=200
  • 浏览器直接访问,就发送get请求。
const http = require('http');
const querystring = require('querystring');

const server = http.createServer((req,res)=>{
    console.log('method',req.method); //get
    const url = req.url;
    console.log('url',url);
    req.query = querystring.parse(url.split('?')[1]);
    console.log('query',req.query);
    res.end(JSON.stringify(req.query));
})

server.listen(8080,()=>{
    console.log(`server is running `)
});

打印如下:

method GET
url /api/list?author=111
query [Object: null prototype] { author: '111' }
method GET
url /favicon.ico
query [Object: null prototype] {}


nodejs处理post请求

  • post请求,即客户端要向server端传递数据
  • 通过postdata来传递数据
  • 浏览器无法直接模拟,需要手写js,或者用postman
const http = require('http');

const server = http.createServer((req,res)=>{
  if(req.method == 'POST'){
    console.log('req content-type',req.headers['content-type']);

    let postData = '';
    req.on('data',chunk =>{
      postData+=chunk.toString();
    })
    req.on('end',() =>{
      console.log('postData:',postData);
      console.log('postData:',typeof postData); //string
      res.end('hello world')
    })
  }
});

server.listen(8000,()=>{
  console.log('ok')
})

开发基本分层

  • bin ---- 基本的搭建服务器
  • app.js ---- 对接口的基本设置
  • router ---- 专门处理路由
  • controller ---- 专门处理/获取数据
    在这里插入图片描述
第一层 基本的搭建服务器的内容,跟其他业务代码没有任何关系 所以抽离出来

在这里插入图片描述

const http = require('http');
const PORT = 8000;
const serverHandle = require('../app');
const server = http.createServer(serverHandle);

server.listen(PORT,()=>{
  console.log(`server is running at ${PORT}`);
})

第二层 app.js 对接口的基本设置,setHeader,获取url,path,query,处理get/post和错误接口的设定

在这里插入图片描述

const querystring = require('querystring');

const handleBlogRouter = require('./src/router/blog');
const handleUserRouter = require('./src/router/user');

const serverHandle = (req, res) => {
  // 设置返回格式 JSON
  res.setHeader('Content-type', 'application/json');
  // 获取path
  const url = req.url;
  req.path = url.split('?')[0];
  
  //解析query 
  req.query = querystring.parse(url.split('?')[1]);
  
  // 处理blog路由
  const blogData = handleBlogRouter(req,res);
  if(blogData){
    res.end(
      JSON.stringify(blogData)
    )
    return 
  }

   // 处理user路由
   const userData = handleUserRouter(req,res);
   if(userData){
     res.end(
       JSON.stringify(userData)
     )
     return 
   }
  //  未命中路由 返回404
  res.writeHead('404',{'Content-type':'text/plain'});
  res.write('404 Not Found \n');
  res.end();
}

module.exports = serverHandle;

第三层 只处理路由 不管处理数据

在这里插入图片描述

const {getList} = require('../controller/blog');
const {SeccessModel,ErrorModel} = require('../model/resModel');

const handleBlogRouter = (req,res)=>{
  const method = req.method;

  // 获取博客列表
  if(method == 'GET' && req.path == '/api/blog/list'){

    const author = req.query.author || '';
    const keyword = req.query.keyword || '';
    const listData = getList(author,keyword);

    return new SeccessModel(listData)
  }
}

module.exports = handleBlogRouter

第四层 只关心数据 不涉及请求 不涉及路由

在这里插入图片描述

const getList = (author,keyword)=>{
  // 先返回数据格式
  return [
    {
      id:1,
      title:'标题A',
      content:'内容A',
      createTime:1568099678175,
      author:'qiufuli'
    }
  ]
}

module.exports = {
  getList
}

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值