简介

net模块太过于麻烦啦,而http模块相对于net的模块就简单多啦。
http模块建立在net模块之上
http模块无须手动管理socket
http模块无须手动组装消息格式

客户端与服务端官网查文档总结

image.png

客户端

http.request(url[, options][, callback])

官方文档

https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_http_request_url_options_callback
由于文档太长截图不易,可以去官网去查看

callback

image.png
而这个函数指向那呢官方文档中说
image.png
[http.IncomingMessage](https://nodejs.org/dist/latest-v14.x/docs/api/http.html#http_class_http_incomingmessage)啊 就是前面讲到的客户端与服务端官方查文档总结图中的

返回值

image.png
这也与客户端与服务端官方查文档总结图中一样

示例

  1. const http = require('http');
  2. const request = http.request(
  3. 'http://yuanjin.tech:5005/api/movie',
  4. {
  5. method: 'GET',
  6. },
  7. (resp) => {
  8. console.log(resp.headers);
  9. console.log(resp.statusCode);
  10. let result = '';
  11. /**
  12. * 服务器响应数据,是不固定的
  13. * 流式操作
  14. */
  15. resp.on('data', (chunk) => {
  16. result += chunk.toString('utf-8');
  17. });
  18. resp.on('end', chunk => {
  19. console.log(JSON.parse(result))
  20. })
  21. }
  22. );
  23. /**
  24. * get 协议的 消息体并不是没有,而是空,没有消息体会让服务器以为客户端还没发送完
  25. */
  26. request.end(); // 表示所有数据写入完毕

服务器

http.createServer([options][, requestListener])

官方文档

image.png

示例

  1. const http = require('http');
  2. const URL = require('url')
  3. /**
  4. * 获取请求体
  5. */
  6. function getRequest(res) {
  7. const urlObj = URL.parse(res.url);
  8. console.log('请求路径', urlObj)
  9. console.log('请求方法', res.method);
  10. console.log('请求头', res.headers);
  11. let body = '';
  12. res.on('data', chunk => {
  13. body += chunk.toString('utf-8');
  14. })
  15. res.on('end', () => {
  16. console.log('请求体', body)
  17. })
  18. }
  19. const serve = http.createServer((res, rep) => {
  20. getRequest(res)
  21. // 响应头
  22. rep.setHeader('a', 'a')
  23. // 响应行
  24. rep.statusCode = '404'
  25. // 响应体
  26. rep.write('hello!!!')
  27. rep.end() // 结束
  28. })
  29. /**
  30. * 监听端口
  31. */
  32. serve.listen(9000)
  33. serve.on('listening', () => {
  34. console.log('listen server 9000 ')
  35. })
  36. // serve.on('connection', () => {
  37. // console.log('有客户端连接进来')
  38. // })

制作简易静态服务器

  1. const http = require('http');
  2. const URL = require('url');
  3. const path = require('path');
  4. const fs = require('fs')
  5. /**
  6. * 文件或文件夹是否存在
  7. * @param {*} fileName
  8. * @returns
  9. */
  10. async function getStat(fileName) {
  11. try {
  12. return await fs.promises.stat(fileName)
  13. } catch {
  14. return false;
  15. }
  16. }
  17. /**
  18. * 获取文件内容
  19. * @param {*} url
  20. */
  21. async function getFileContent(url) {
  22. const urlObj = URL.parse(url);
  23. // console.log(urlObj.pathname);
  24. let fileName = path.resolve(__dirname, urlObj.pathname.substr(1))
  25. let stat = await getStat(fileName)
  26. if(!stat) {
  27. return null;
  28. } else if (stat.isDirectory()) {
  29. /**
  30. * 可能访问的路径是一个文件夹
  31. * 当着文件夹可能是空的
  32. * 也可能里面存放着index.html
  33. * 也可能是一个index.html
  34. */
  35. fileName = path.resolve(__dirname, urlObj.pathname.substr(1), 'index.html');
  36. stat = await getStat(fileName);
  37. if (stat) {
  38. return await fs.promises.readFile(fileName);
  39. } else {
  40. return null;
  41. }
  42. } else {
  43. return await fs.promises.readFile(fileName)
  44. }
  45. }
  46. /**
  47. * requestListenner
  48. * @param {*} req
  49. * @param {*} res
  50. */
  51. async function requestListenner (req, res) {
  52. const info = await getFileContent(req.url)
  53. if(info) {
  54. res.write(info)
  55. } else {
  56. res.statusCode = 404;
  57. res.write('Resource is not exist');
  58. }
  59. console.log('有客户端连接')
  60. res.end();
  61. }
  62. const server = http.createServer(requestListenner);
  63. server.listen(9000)
  64. server.on('listening', () => {
  65. console.log('linten server 9000')
  66. })