【HTTP全解】HTTP请求与响应

194 阅读4分钟

请求与响应模型

  • 客户端(浏览器)发出请求,服务器发出响应。

如何发送请求

  • 方法
    1. 浏览器地址栏
    2. 用curl命令
  • 用户代理:User Agent。替用户发送请求的工具。
    • Pasted image 20220622161359.png

如何发出响应

  • 编程手段
  • 启用代码,监听对应端口:node server.js 8888
  • 对端口发送请求的两种方法
    • 在浏览器中打开http://localhost:8888
    • 在命令行中执行curl http://127.0.0.1:8888
  • 注意
    • 这些代码就是服务器代码,一般放在服务器上。
    • path是不带查询参数的路径/x
    • query是查询参数的对象形式{a:'1'}
    • queryString是查询参数的字符串形式?a=1
    • pathWithQuery是带查询参数的路径,一般不用。
    • request是请求对象。
    • response是响应对象。

代码逻辑

console.log('路径(带查询参数)为:' + pathWithQuery)

if(path === '/'){
    response.statusCode = 200
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write(`Hello world.`)
    response.end()
}else {
    response.statusCode = 404
    response.setHeader('Content-Type', 'text/html;charset=utf-8')
    response.write(`你输入的路径不存在对应的内容`)
    response.end()
}
  • response.statusCode = 200:设置这次响应的状态代码。
  • console.log('路径(带查询参数)为:' + pathWithQuery):在服务器端console输出访问路径。
  • response.setHeader('Content-Type', 'text/html;charset=utf-8'):设置响应的内容的类型、语法与编码。
    • 这里的html可以改为CSS或者javascript,但后者不能用js缩写。
  • response.write('Hello world.'):把内容在客户端输出。
  • response.end():结束响应。
  • 语法
    • ``里面可以回车。
    • ' ' 里面要回车只能用\n表示。
  • 逻辑
    • 每次收到请求都会把中间的代码执行一遍。
    • 用 if else 判断路径,并返回响应。
    • 如果是已知路径,statusCode一律返回 200。
    • 如果是未知路径,statusCode一律返回 404。
    • Content-Type表示内容的“类型/语法”。
    • response.write():可以填写返回的内容。
    • response.end():表示响应可以发给用户了,如果没有end,客户端会一直等待响应。
  • 注意
    • 在URL里后缀没有用,./y.css不一定是CSS内容,Content-Type才是决定内容的关键,也因此HTTP协议中文件在某些情况下可以不加后缀。
    • HTML/CSS/JS本质都是字符串。

请求和响应的规范写法

  • 标准制定者:RFC 2616
  • 查阅文档:Node.js文档

HTTP基础概念

请求

  • 请求格式
    • Pasted image 20220623153421.png
  • 请求动词有 GET / POST / PUT / PATCH / DELETE。
    • GET:默认。获取内容。
    • POST:上传内容。
  • 请求格式三部分、请求行、请求头、 请求体。
  • 注意
    • 请求体在GET请求中一般为空。
    • 大小写不敏感。

响应

  • 响应格式
    • Pasted image 20220623153816.png
  • 响应格式三部分:状态行、响应头、响应体。
  • 状态码和内容没有直接的关系,哪怕状态码为404也可以和对方发送消息。
  • 常见的状态码是考点。

用curl构造请求

  • curl -v http://localhost:8888
    • -v:为了查看过程,没有也行。
  • 设置请求动词:-X
    • 注意大小写。
    • 例:curl -v -X POST http://localhost:8888
  • 设置路径和查询参数:直接在url后面加。
    • #锚点是不会发送到服务器的。
    • 例:curl -v http://localhost:8888/index?wd=hi
  • 设置请求头:-H 'Name: Value'或者--header 'Name: Value'
    • 例:curl -v -H 'Accept: text/html' http://localhost:8888
  • 设置请求体:-d '内容'或者--data '内容'
    • 例:curl -v -X POST -H 'Content-Type: text/plain;charset=utf-8' -d '请求体内容' http://localhost:8888/index

用Node.js读取请求

var url = require('url')
var parsedUrl = url.parse(request.url, true)
// 路径,带查询参数
var pathWithQuery = request.url 
// 路径,不带查询参数
var path = parsedUrl.pathname
// 查询参数
var query = parsedUrl.query
// 请求动词
var method = request.method
  • 读取请求动词:request.method
  • 读取路径
    • request.url:路径,带查询参数
    • url.parse(request.url, true).pathname:纯路径,不带查询参数
    • url.parse(request.url, true).query:只有查询参数
  • 读取请求头:request.headers
  • 读取请求体

用Node.js设置响应

// 设置响应状态码
response.statusCode = 200
// 设置响应头
response.setHeader('Content-Type', 'text/html;charset=utf-8')
// 设置响应体
response.write(`
	<!DOCTYPE html>
	<html lang="en">
	<head>
		<meta charset="UTF-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>Document</title>
		<link rel="stylesheet" href="/x">
	</head>
	<body>
		<h1>标题</h1>
		<script src="/y"></script>
	</body>
	</html>
`)
// 结束响应
response.end()
  • 设置响应状态码:response.statusCode = 200
  • 设置响应头:response.setHeader('Content-Type', 'text/html');
    • 也可以自定义,例:response.setHeader('Frank', 'Good');
  • 设置响应体:response.write('内容')
    • 响应体可以追加内容

拓展

文件后缀

  • 后缀本身没有特殊功能,它的意义在于“告诉”系统用什么软件执行这个程序。
  • 换句话说,如果有其他的方法告诉系统应该用什么软件执行程序,那么没有后缀也可以。

HTTP的路径

  • HTTP中,根目录是项目的目录,所有HTTP的路径都是以/开头的。
  • 故如./style.css这类路径在HTTP中是错误的,正确写法为/style.css