请求和响应 & Node.js Server
请求与响应模型
帮你发请求的工具叫做User-Agent
如何做出一个响应
- Node.js 有一个 http 模块可以做到
注意事项
- 这些代码就是服务器代码,一般放在服务器上
- 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 用来上传内容
- 请求体在 GET 请求中一般为空
- 文档位于RFC 2612 Chapter 5
- 大小写不敏感(随意)
HTTP 基础概念之响应
- 协议名/版本 状态码 状态字符串
- Content-Type: 响应体的格式
- 回车
- 响应体(也就是下载内容)
细节
- 三部分: 状态行、 响应头、 响应体
- 常见的状态码是考点
- 文档位于RFC 2612 Chapter 6
用 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