请求和响应 & Node.js Server

请求与响应模型

帮你发请求的工具叫做User-Agent

如何做出一个响应

注意事项

  • 这些代码就是服务器代码,一般放在服务器上
  • path 是不带查询参数的路径 /x
  • query 是查询参数的对象形式{a:’1’}
  • queryString 是查询参数的字符串形式?a=1
  • pathWithQuery 是带查询参数的路径,一般不用
  • request 是请求对象
  • response 是响应对象

代码逻辑

  • 每次收到请求都会把中间的代码执行一遍
  • 用 if else 判断路径,并返回响应
  • 如果是已知路径,一律返回 200
  • 如果是未知路径,一律返回 404
  • Content-Type 表示内容的类型/语法
  • response.write()可以填写返回的内容
  • response.end()表示响应可以发给用户了

URL 里的后缀没有用, /y.css 不一定是 CSS 内容

Content-Type 才是决定文件类型的关键

HTTP 基础概念之请求

  • 请求动词 路径加查询参数 协议名/版本
  • Host: 域名或 IP
  • Accept: text/html
  • Content-Type: 请求体的格式
  • 回车
  • 请求体(也就是上传内容)

细节

  • 三部分: 请求行、请求头、请求体
  • 请求动词有 GET/POST/PUT/PATCH/DELETE 等

GET 用来获取内容,POST 用来上传内容

HTTP request methods | MDN

HTTP Messages | MDN

  • 请求体在 GET 请求中一般为空
  • 文档位于RFC 2612 Chapter 5
  • 大小写不敏感(随意)

HTTP 基础概念之响应

  • 协议名/版本 状态码 状态字符串
  • Content-Type: 响应体的格式
  • 回车
  • 响应体(也就是下载内容)

细节

用 curl 构造请求

curl -v http://localhost:8888/

可以得到

*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8888 (#0)
> GET / HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: text/html;charset=utf-8
< Date: Mon, 24 Feb 2020 04:40:59 GMT
< Connection: keep-alive
< Transfer-Encoding: chunked
<

        <!DOCTYPE html>
        <head>
            <link rel="stylesheet" href="/x">
        </head>
        <body>
            <h1>我是一个h1标签</h1>
        </body>
* Connection #0 to host localhost left intact
    * Closing connection 0

再试试

curl -v -X POST http://localhost:8888/

可以得到

> POST / HTTP/1.1

加上锚点再试试

curl -v -X POST http://localhost:8888/xxxx\?wd=hi#nihao

得到了:

* Connected to localhost (::1) port 8888 (#0)
> POST /xxxx?wd=hi HTTP/1.1
> Host: localhost:8888
> User-Agent: curl/7.64.1
> Accept: */*

这里可以看到,锚点#nihao是不会发到服务器的。
还可以更改请求头:

curl -v -X POST -H ‘Accept: text/html’ http://localhost:8888/xxxx\?wd=hi#nihao

还可以更改请求体内容:

curl -v -X POST -H ‘xiu: niubi’ -H 'Content-Type: text/plain;charset=utf—8’ -d ‘请求体内容’ http://localhost:8888/xxxx\?wd=hi#nihao

总结一下:

curl -v http://127.0.0.1:8888

设置请求动词

  • -X POST
  • 注意大小写

设置路径和查询参数

  • 直接在 url 后面加

设置请求头

  • -H ’Name: Value’或者—header 'Name: Value’

设置请求体

  • -d ‘内容’或者—data ‘内容’

用 Node.js 读取请求

读取请求动词

  • request.method

读取路径

  • request.url 路径,带查询参数
  • path 纯路径,不带查询参数
  • query 只有查询参数

读取请求头

  • request.headers[‘accept']

读取请求体

  • 比较复杂,先不说

用 Node.js 设置响应

设置响应状态码

  • response.statusCode = 200

设置响应头

  • response.setHeader(‘Content-Type', 'text/html’)

设置响应体

  • response.write(’内容’)
  • 可追加内容

经验

console.log 可以验证对错,不要相信自己,要相信 console.log

我不要你觉得,我要 我觉得console.log 觉得

部署 Node.js 应用到云服务器

ssh 远程登录

echo ‘复制本地~/.ssh/id_rsa.pub内容' >> ~/.ssh/authorized_keys

防止 ssh 卡住

echo “Host *” >> /etc/ssh/ssh_config
echo “  ServerAliveInterval 30” >> /etc/ssh/ssh_config

创建应用账户

adduser frank
mkdir  /home/frank/.ssh
cp ~/.ssh/authorized_keys /home/frank/.ssh/
chmod 755 /home/frank/.ssh/authorized_keys
chown frank:frank /home/frank/.ssh/authorized_keys

adduser frank sudo

安装 Node.js 8

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

部署应用

git clone https://github.com/FrankFang/nodejs-test.git
cd nodejs-test
touch log
启动命令:node server.js 8888 > log 2>&1 &
把启动命令做成 start 文件
添加执行权限 chmod +x ./start
运行 sh ./start 得到一个进程号 pid
tail log 看 log 内容
kill -9 pid 可以关掉进程
killall node 可以关掉所有 node 进程

如何重启应用

ssh frank@实例ip
cd nodejs-test
git pull
killall node(因为忘了进程号,实际上可以记下来)
sh ./start
comments powered by Disqus