HTTP

178 阅读4分钟

请求响应模型

服务器:服务器就是远程一台没有显示器的电脑,有ip有端口

我们操作浏览器(客户端)也会有一个IP,请求就是客户端发送一个东西到服务器,响应就是服务器拿到东西后在同一个端口返回一个响应

如何发请求

  1. 用浏览器地址栏
  2. 用curl命令
  3. 帮你发请求的工具叫用户代理,user agent

如何做响应

响应代码要放在服务器上这些代码就是服务器代码,可以用Node.js有一个http模块做到。

  1. 新建文件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)

  1. 运行该程序node server.js 8888服务器占用一个端口8888,这个端口就被server.js(也就是服务器)监听了。每次再打这一行代码服务器就会重新启动
  2. 这时只要有人请求了localhost:8888,就会进入服务器的代码里面每请求一次,服务器里的代码就会运行一次。因为服务器的ip地址和你电脑的ip地址是一个。
  3. 比较:这个和hs有什么区别,上面代码就是为了实现hs,hs命令占用监听了8080端口,有人访问localhost:8888时就会做出响应
  4. 如果是已知路径,一律返回200,如果是未知路径,一律返回404。用ifelse判断路径,并返回相应的响应

关于请求时的路径中文件后缀

response.setHeader('Content-Type', 'text/css;charset=utf-8') ,我们写请求时会写 “/根目录” "/x根目录下的x文件" 不写后缀因为Content-Type已经规定该返回什么样的文件类型, 比如在hs时我常加/index.html但是加/index也可以。
PATH全部以根目录/开头

http请求构成

请求行Request-Line

  1. 请求动词 路径加查询参数 协议名/版本
  2. 例如GET / HTTP/1.1
  3. 如果路径加查询参数未写,就会自动补上根路径/
  4. 请求动词有GET(获取内容)/POST(上传内容)/PUT/PATCH/DELETE等

请求头Requset Header

  1. Host:请求的域名或者IP+端口号
  2. Accept:text/html ——告诉服务器我想要的文本类型
  3. User-Agent:用户代理,帮你发请求的工具,可以为Chrome或者curl
  4. Content-Type:请求体的格式

回车——隔开请求头和请求体

请求体Request Body(请求动词为POST时的上传内容)

  1. 请求体为上面Content-Type的规定的格式的任意内容
  2. 请求体在GET请求中一般为空
  3. 请求体在POST请求中为上传内容
  4. get请求一般是空的

http响应的构成

状态行

  1. 协议名/版本 状态码 状态字符串
  2. 状态码:200表示请求的路径服务器是知道的;404表示请求的路径服务器不知道

响应头Response Headers

  1. Content-Type:响应体的格式“类型/语法”

回车

隔开响应头响应体

  1. 响应体为返回给客户端的内容
  2. 响应体一般为下载内容

curl命令

  1. 设置请求动词,默认是GET,改成POST:添加-X POST(注意大写)例如 curl -v -X POST http://127.0.0.1:8888
  2. 设置路径和查询参数,直接在url后面加,例如curl -v -X POST http://127.0.0.1:8888/xxxx?wd=hi,锚点没有用不会发送到服务器
  3. 设置请求头-HName: Value'或者--header 'Name: Value'例如curl -v -H 'Accept: text/html' http://127.0.0.1:8888`我想要HTML
  4. 设置请求体-d '内容'或者--data '内容' curl -v -H 'Content-Type: text/plain;charset=utf-8' -d '请求体内容' http://127.0.0.1:8888我要上传的内容是纯文本,上传的内容为“请求体内容”

其他

  1. HTTP标准是RFC 2612
  2. 每次修改服务器代码都要重启服务器
  3. HTTP中所有路径都是绝对路径

远程服务器

  1. 先配置好公钥私钥echo '复制本地~/.ssh/id_rsa.pub内容' >> ~/.ssh/authorized_keys
  2. ssh 进入服务器
  3. 首次进入时当前用户会是root用户,最高权限用户
  4. adduser frank 添加用户,创建了~/home/frank,root和frank的~是不一样的
  5. 添加以下代码
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)
  1. adduser frank sudo以root用户身份添加frank为管理员