请求响应模型
服务器:服务器就是远程一台没有显示器的电脑,有ip有端口
我们操作浏览器(客户端)也会有一个IP,请求就是客户端发送一个东西到服务器,响应就是服务器拿到东西后在同一个端口返回一个响应
如何发请求
- 用浏览器地址栏
- 用curl命令
- 帮你发请求的工具叫用户代理,user agent
如何做响应
响应代码要放在服务器上这些代码就是服务器代码,可以用Node.js有一个http模块做到。
- 新建文件server.js,并写入以下代码。这时文件server.js相当于一个服务器了。当有人发起请求时服务器就会按照代码进行相应的响应
var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]
if(!port){
console.log('请指定端口号好不啦?\nnode server.js 8888 这样不会吗?')
process.exit(1)
}
var server = http.createServer(function(request, response){
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('有个傻子发请求过来啦!路径(带查询参数)为:' + pathWithQuery)
if(path === '/'){
response.statusCode = 200
response.setHeader('Content-Type', 'text/html;charset=utf-8')
response.write(`二哈`)
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(`你输入的路径不存在对应的内容`)
response.end()
}
/******** 代码结束,下面不要看 ************/
})
server.listen(port)
console.log('监听 ' + port + ' 成功\n请用在空中转体720度然后用电饭煲打开 http://localhost:' + port)
- 运行该程序
node server.js 8888服务器占用一个端口8888,这个端口就被server.js(也就是服务器)监听了。每次再打这一行代码服务器就会重新启动 - 这时只要有人请求了localhost:8888,就会进入服务器的代码里面每请求一次,服务器里的代码就会运行一次。因为服务器的ip地址和你电脑的ip地址是一个。
- 比较:这个和hs有什么区别,上面代码就是为了实现hs,hs命令占用监听了8080端口,有人访问localhost:8888时就会做出响应
- 如果是已知路径,一律返回200,如果是未知路径,一律返回404。用ifelse判断路径,并返回相应的响应
关于请求时的路径中文件后缀
response.setHeader('Content-Type', 'text/css;charset=utf-8') ,我们写请求时会写 “/根目录” "/x根目录下的x文件" 不写后缀因为Content-Type已经规定该返回什么样的文件类型,
比如在hs时我常加/index.html但是加/index也可以。
PATH全部以根目录/开头
http请求构成
请求行Request-Line
- 请求动词 路径加查询参数 协议名/版本
- 例如GET / HTTP/1.1
- 如果路径加查询参数未写,就会自动补上根路径/
- 请求动词有GET(获取内容)/POST(上传内容)/PUT/PATCH/DELETE等
请求头Requset Header
- Host:请求的域名或者IP+端口号
- Accept:text/html ——告诉服务器我想要的文本类型
- User-Agent:用户代理,帮你发请求的工具,可以为Chrome或者curl
- Content-Type:请求体的格式
回车——隔开请求头和请求体
请求体Request Body(请求动词为POST时的上传内容)
- 请求体为上面Content-Type的规定的格式的任意内容
- 请求体在GET请求中一般为空
- 请求体在POST请求中为上传内容
- get请求一般是空的
http响应的构成
状态行
- 协议名/版本 状态码 状态字符串
- 状态码:200表示请求的路径服务器是知道的;404表示请求的路径服务器不知道
响应头Response Headers
- Content-Type:响应体的格式“类型/语法”
回车
隔开响应头响应体
- 响应体为返回给客户端的内容
- 响应体一般为下载内容
curl命令
- 设置请求动词,默认是GET,改成POST:添加-X POST(注意大写)例如 curl -v -X POST http://127.0.0.1:8888
- 设置路径和查询参数,直接在url后面加,例如curl -v -X POST http://127.0.0.1:8888/xxxx?wd=hi,锚点没有用不会发送到服务器
- 设置请求头
-HName: Value'或者--header 'Name: Value'例如curl -v -H 'Accept: text/html' http://127.0.0.1:8888`我想要HTML - 设置请求体
-d '内容'或者--data '内容'curl -v -H 'Content-Type: text/plain;charset=utf-8' -d '请求体内容' http://127.0.0.1:8888我要上传的内容是纯文本,上传的内容为“请求体内容”
其他
- HTTP标准是RFC 2612
- 每次修改服务器代码都要重启服务器
- HTTP中所有路径都是绝对路径
远程服务器
- 先配置好公钥私钥
echo '复制本地~/.ssh/id_rsa.pub内容' >> ~/.ssh/authorized_keys - ssh 进入服务器
- 首次进入时当前用户会是root用户,最高权限用户
- adduser frank 添加用户,创建了~/home/frank,root和frank的~是不一样的
- 添加以下代码
mkdir /home/frank/.ssh(创建ssh文件夹)
cp ~/.ssh/authorized_keys /home/frank/.ssh/(复制公钥)
chmod 755 /home/frank/.ssh/authorized_keys(修改权限改成可读)
chown frank:frank /home/frank/.ssh/authorized_keys(把key的拥有者变成frank)
- adduser frank sudo以root用户身份添加frank为管理员