请求与响应模型
如何发送请求
- 方法
- 浏览器地址栏
- 用curl命令
- 用户代理:User Agent。替用户发送请求的工具。
如何发出响应
- 编程手段
- 启用代码,监听对应端口:
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本质都是字符串。
请求和响应的规范写法
HTTP基础概念
请求
- 请求格式
- 请求动词有 GET / POST / PUT / PATCH / DELETE。
- 请求格式三部分、请求行、请求头、 请求体。
- 注意
响应
- 响应格式
- 响应格式三部分:状态行、响应头、响应体。
- 状态码和内容没有直接的关系,哪怕状态码为404也可以和对方发送消息。
- 常见的状态码是考点。
用curl构造请求
curl -v http://localhost:8888
- 设置请求动词:
-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。