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 进程
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容