HTTP学习与实践

678 阅读2分钟

基本概念

  • HTTP全称HyperText Transfer Protocol,超文本传输协议;
  • HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。
  • 帮我们发送请求的工具就叫做用户代理(User Agent);
  • 那服务器如何做出响应呢?在这里我们使用node.js里面的http模块可以做到,把代码放到服务器上运行;
  • 在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。
  • 服务器就是没有显示器的电脑,有IP有端口;前端写的代码是运行在客户端,后端写的代码是运行在服务端,客户端会发送请求到服务端,这就是请求,服务器会给客户端反应就是响应;

HTTP工作原理

HTTP实践

  • 那如何发送请求呢,我们通常可以使用浏览器和curl命令;使用chrome浏览器的开发者工具可以看到网站的请求与服务器的响应; 下面的图片是chrome浏览器发送的请求与响应图

本地搭建一个有所响应的node.js的服务器

  • 1.新建一个文件夹,里面新建一个js,暂时命名为server.js,并把以下代码复制到js文件中
let http = require('http');
let fs = require('fs');
let url = require('url');
let port = process.argv[2];

if(!port){
  console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?');
  process.exit(1)
}

let server = http.createServer(function(request, response){
  let parsedUrl = url.parse(request.url, true);
  let pathWithQuery = request.url;
  let queryString = '';
  if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  let path = parsedUrl.pathname;
  let query = parsedUrl.query;
  let method = request.method;
  console.log(request.headers);
  console.log('发请求过来啦!路径(带查询参数)为:' + pathWithQuery);
  if(path === '/'){
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/html;charset=utf-8');
    response.write(`请求成功!\n`);
    response.end()
  } else if(path === '/x'){
    response.statusCode = 200;
    response.setHeader('Content-Type', 'text/css;charset=utf-8');
    response.write(`body{color: red;}`);
    response.end()
  } else {
    response.statusCode = 404;
    response.setHeader('Content-Type', 'text/html;charset=utf-8');
    response.write(`你输入的路径不存在对应的内容\n`);
    response.end()
  }

});

server.listen(port);
console.log('监听 ' + port + ' 成功\n请在浏览器打开 http://localhost:' + port);


  • 启动本地服务器>> node server.js, 由于代码中需要自己设定端口号,而我们启动的时候没有设定,所以服务器会有以下反应;

  • 重新使用node server.js 8888启动

同时,我们启动的本地服务器有以下反应

上面的server.js里面的代码就是服务器代码了,一般放在服务器上;

  • 我们也可以使用curl命令方式来发起请求:

深入分析HTTP请求与响应

  • 请求头分析,如下图;

  • 我们也可以使用curl命令发送一个post请求

  • 服务器是可以得到请求的所有响应头
  • 响应体分析: