1. http
1.1 http状态码
分类 | 描述 |
---|---|
1** | 信息 |
2** | 成功 |
3** | 重定向 |
4** | 客户端错误 |
5** | 服务器错误 |
1.2 请求方式
-
GET 获取
- 数据放在 url 里面传输的,容量 ≤ 32k
-
POST 发送数据
- 容量大
2. 接收 GET 数据
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<form action="http://localhost:8080/aaa" method="GET">
用户:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" id="" name="" value="提交"/>
</form>
</body>
</html>
const http = require('http');
const url = require('url');
let server = http.createServer((req, res) => {
// 解析 GET 过来的数据
// 添加参数 true,能将query参数也一起解析了
let result = url.parse(req.url, true);
let {
query, pathname} = result;
console.log(result);
console.log(query,pathname);
});
server.listen(8080);
3. 原生处理 POST 数据
3.1 普通数据 —— querystring,url
const http = require('http');
const querystring = require('querystring');
let server = http.createServer((req, res) => {
console.log(req.method); // POST
let arr = [];
// 当有数据
req.on('data',(buffer) => {
// console.log(buffer); // <Buffer 75 73 65 72 6e 61 6d 65 3d 61 64 6d 69 6e 26 70 61 73 73 77 6f 72 64 3d 31 32 33 33 32 31>
arr.push(buffer);
});
// 数据结束
req.on('end',() => {
let buffer = Buffer.concat(arr);
let post = querystring.parse(buffer.toString());
console.log(post);
// console.log(buffer.toString()); // <Buffer 75 73 65 72 6e 61 6d 65 3d 61 64 6d 69 6e 26 70 61 73 73 77 6f 72 64 3d 31 32 33 33 32 31>
});
});
server.listen(8080);
3.2 文件数据 buffer
-
form上传文件,要添加
enctype='application/x-www-form-urlencoded'
,enctype 默认值为 application/x-www-form-urlencoded<form action="http://localhost:8080/upload" method="POST" enctype="multipart/form-data"> 用户: <input type="text" name="username"><br> 密码: <input type="password" name="password"><br> <input type="file" name="f1"><br><br> <input type="submit"> </form>
const http = require('http'); http.createServer((req, res) => { let arr = []; console.log(req.headers); req.on('data',(buffer) => { arr.push(buffer); }); req.on('end',() => { let buffer = Buffer.concat(arr); console.log(buffer.toString()); }); }).listen(8080);
结果:
注:在请求头中能获取到分隔符,注意横杠数 -
在 buffer 中查找
let buffer = new Buffer('abc\r\ndfadsa\r\ndfawfdsafdsa'); console.log(buffer.indexOf('\r\n')); // 3
-
切分方法封装
let buffer = new Buffer('abc\r\ndfadsa\r\ndfawfdsafdsa'); console.log(buffer.indexOf('\r\n')); // 3 function bufferSplit(buffer, delimiter) { let arr = []; let n = 0; while ((n = buffer.indexOf(delimiter)) != -1) { arr.push(buffer.slice(0, n)); buffer = buffer.slice(n + delimiter.length); //跳过分隔符长度 } arr.push(buffer); // 将最后的一块添加进去 return arr; }; console.log(bufferSplit(buffer, '\r\n').map(a => a.toString()));
-
源码
const http = require('http'); const fs = require('fs'); function bufferSplit(buffer, delimiter) { let arr = []; let n = 0; while ((n = buffer.indexOf(delimiter)) != -1) { arr.push(buffer.slice(0, n)); buffer = buffer.slice(n + delimiter.length); //跳过分隔符长度 } arr.push(buffer); // 将最后的一块添加进去 return arr; }; http.createServer((req, res) => { let arr = []; let boundary = '--' + req.headers['content-type'].split('; ')[1].split('=')[1] req.on('data', (buffer) => { arr.push(buffer); }); req.on('end', () => { let buffer = Buffer.concat(arr); // 按照分隔符切分 let result = bufferSplit(buffer, boundary); // 去掉头 null 和 尾 \r\n-- result.pop(); result.shift(); // 针对其中的每一个处理 result.forEach(buffer => { // 去掉 头尾的 \r\n buffer = buffer.slice(2, buffer.length - 2); // 使用 \r\n 切 let n = buffer.indexOf('\r\n\r\n'); let info = buffer.slice(0, n).toString(); let data = buffer.slice(n + 4); // console.log(info.toString()); if (info.indexOf('\r\n') != -1) { // 文件 let result2 = info.split('\r\n')[0].split('; '); let name = result2[1].split('=')[1]; let filename = result2