2020-12-10 HTTP全解 - 请求&响应 + Node.js服务器

1. 请求&响应

1.1 Concept

  • 客户端向服务器端发送请求,服务器响应请求从同个端口向客户端发送response
  • 发请求的工具叫用户代理(User-Agent)


2. Node.js 服务器

2.1 先导

  • 启动服务器并监听端口:node xxx.js [port]
  • response 代码:
/* 引入http server相关的包 */
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2] // 第2个参数指定为端口号

/* 要求用户输入端口号 */
if(!port){
  console.log('Please describe the port number: node server.js 8888')
  process.exit(1)
}

/* 配置服务器响应机制 */
var server = http.createServer(function(request, response){
  /* 解析request路径 */
  var parsedUrl = url.parse(request.url, true)
  var pathWithQuery = request.url 
  var queryString = ''
  if(pathWithQuery.indexOf('?') >= 0){ queryString = pathWithQuery.substring(pathWithQuery.indexOf('?')) }
  var path = parsedUrl.pathname
  var query = parsedUrl.query
  var method = request.method 
  console.log('Query path is' + pathWithQuery)

  /* 根据不同路径进行不同回复 */
  if(path === '/'){
    response.statusCode = 200
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    /* 可直接回复html 内容并使用<link href>引用css内容 */
    // 不用单引号,``中可带回车
    response.write(`
      <!DOCTYPE html>
      <head>
        <link rel="stylesheet" href="/x">
      </head>
      <body>
          <h1>Title</h1>
      </body>
    `) 
    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(`No content exists.\n`)
    response.end()
  }
})

server.listen(port) // 开始监听指定端口
console.log('Now the server is listening to port ' + port + '  please open with the url: http://localhost:' + port)

2.2 Note

  • URL后缀没用,文件类型看Content-Type中的描述
  • Content-Type:类型/语法
    text/csstext/html 分别表示css和html文件
  • response.write 将内容写入response的body中
  • response.end() 执行后立即发送response
  • 在html中请求css用<link rel="stylesheet" href="">,href中加路径
  • 在html中使用js用<script src=""></script>,src中加路径


3. HTTP系统

3.1 Concept

(1) 请求

请求行 + 请求头 + 请求体

  • 基本格式:请求动词(GET POST DELETE PUT...) + 路径&参数 + 协议名/版本(HTTP/1.1)
  • HOST:域名/IP
  • Accept:想接收response的内容 text/html
/* 查看accept */
console.log(request.headers) // 查看header所有内容
var accept = request.headers['accept']
console.log(accept)
  • Content-Type:请求体格式
  • 上面为请求行和请求体内容,请求体用下一行隔开,GET请求体一般为空
(2) 响应

状态行 + 响应头 + 响应体

  • 基本格式:协议名/版本 + 状态码 + 状态字符串
  • Content-Type:响应体格式
  • 上面为状态行和响应头内容,响应体用下一行隔开
  • 常见状态码:喵星人教你 HTTP 状态码
    返回404时部分浏览器自动显示404页面

3.2 用curl发请求

curl -v [url] - 发送GET请求
curl -v [url] > [download path] - 用GET下载文件
curl -v -X [method] -H [headers] --data [body] [url] - 完整请求

  • 设置请求动词:-X [method]
  • 设置路径和查询参数:直接加url里
    注意锚点是不会发送到服务器的
  • 设置请求头:-H [headers]
  • 设置请求体:-d [body]

3.3 Node.js 处理请求和响应

(1) 处理请求
  • url: request:url
  • method: request.method
  • headers: request.headers[header]
(2) 设置响应
  • statusCode: response.statusCode
  • header: response.setHeader(header, content)
  • body: response.write(body) write可以追加内容


4. 部署Node.js 代码

4.1 创建应用账户(当前为root账户)

adduser xyc # 创建用户,访问时使用xyc@ip进入应用账户

mkdir  /home/xyc/.ssh  # 创建.ssh文件
cp ~/.ssh/authorized_keys /home/xyc/.ssh/ # 复制公钥
chmod 755 /home/xyc/.ssh/authorized_keys # 赋予可读权限
chown xyc:xyc /home/xyc/.ssh/authorized_keys # 把key的拥有者变成xyc

# 在root账户运行 'adduser xyc sudo' 使其获得超级管理员权限
adduser xyc sudo

4.2 安装Node.js

  • 需要管理员权限时在命令前加sudo
  • ctrl + a 回到命令开头,ctrl + e 回到命令结尾
curl -sL https://deb.nodesource.com/setup_8.x | sudo bash -
sudo sed -i 's/deb.nodesource.com\/node_8.x/mirrors.tuna.tsinghua.edu.cn\/nodesource\/deb_8.x/g' /etc/apt/sources.list.d/nodesource.list
sudo apt-get update
sudo apt-get install -y nodejs
node -v
npm -v
npx -v

sudo apt install git

4.3 部署

git clone https://github.com/FrankFang/nodejs-test.git
cd nodejs-test
touch log
node server.js 8888 > log 2>&1 & # 后台启动,并把内容输出到log中
touch start # 把启动命令做成 start 文件
echo 'node server.js 8888 > log 2>&1 &' >> ./start
chmod +x ./start # 添加执行权限 
sh ./start # 运行后得到一个进程号 pid
tail log # 看 log 内容
kill -9 pid # 可以关掉指定进程号的进程
killall node # 可以关掉所有 node 进程
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容