<html>
<head>
<meta charset="utf-8">
<title>表单提交title>
head>
<body>
<form action="http://127.0.0.1:2080/" method="GET">
<input type="text" name="name"><br>
<input type="text" name="age">
<input type="radio" name="sex" value="男">男
<input type="radio" name="sex" value="女">女
<br>
<input type="submit">
form>
body>
html>
这里重要利用了url模块,其中url.parse(req.url, true).query,
url.parse()第二个参数设置为true,则 query 属性总会通过 querystring 模块的 parse() 方法生成一个对象。 如果为 false,则返回的 URL 对象上的 query 属性会是一个未解析、未解码的字符串。 默认为 false。
const http = require('http');
const url = require('url');
const server = http.createServer((req, res) => {
const queryObj = url.parse(req.url, true).query;
res.writeHead(200, {
'Content-Type': 'text/html; charset=UTF8'
})
const name = queryObj.name;
const age = queryObj.age;
const sex = queryObj.sex;
res.write(`服务器接受到提交: name:${name}, age: ${age}, sex: ${sex}`);
res.end();
})
server.listen(2080, '127.0.0.1');
命令行启动服务器 ,打开html文件,注意不需要写服务器域名
填写表单,提交数据,当点击提交后,请求的的url直接从file:///Users/shaojinghong/Desktop/form.html
变成http://127.0.0.1:2080/?name=jinghong&age=22&sex=%E7%94%B7
post请求服务端固定写法: req.addListener(‘data’, (chunk) => { })和req.addListener(‘end’, () => {});用来一段一段接受buffer格式的表单数据,然后调用toString()得到字段name=%E6%99%AF%E6%B4%AA&%E7%94%B7=on,然后调用 querystring模块的parse(dataString)将这种字符串转换成对象
const http = require('http');
const querystring = require('querystring');
const server = http.createServer((req, res) => {
if (req.url == '/dopost' && req.method.toLowerCase() == 'post'){
// 如果访问的地址是这个,并且请求方法是post
let allData = '';
// 下面是为了追求极致,是一小段一小段chunk接收的
req.addListener('data', (chunk) => {
// chunk为buffer类型
allData += chunk;
console.log(chunk); // 6 e 61 6d 65 3d 25 45 36 25 39 39 25 41 46 25 45 36 25 42 34 25 41 41 26 25 45 37 25 39 34 25 42 37 3d 6f 6e>
});
// 表单chunk全部接收完毕
req.addListener('end', () => {
let dataString = allData.toString();
console.log(dataString);// name=%E6%99%AF%E6%B4%AA&%E7%94%B7=on
let dataobj = querystring.parse(dataString);
console.log(dataobj); // { name: '景洪', '男': 'on' }
res.end('success');
})
}
});
server.listen(8080, '127.0.0.1');
<html>
<head>
<title>post实验title>
<meta charset="utf-8">
head>
<body>
<form action="http://127.0.0.1:8080/dopost" method="post">
<p>
姓名:<input type="text" name="name">
p>
<p>
性别:
<input type="radio" name="男">男
<input type="radio" name="女">女
p>
<p>
<input type="submit">
p>
form>
body>
html>
注意使用 < form action=”http://127.0.0.1:8080/dopost” method=”post” enctype=”multipart/form-data” >和< input type=”file” name=”picture” >标签
关于file上传标签说明:http://www.w3school.com.cn/jsref/dom_obj_fileupload.asp
具体代码:
<html>
<head>
<title>post实验title>
<meta charset="utf-8">
head>
<body>
<form action="http://127.0.0.1:8080/dopost" method="post" enctype="multipart/form-data">
<p>
姓名:<input type="text" name="name">
p>
<p>
性别:
<input type="radio" name="男">男
<input type="radio" name="女">女
p>
<p>
图片上传
<input type="file" name="picture">
p>
<p>
<input type="submit">
p>
form>
body>
html>
formidable: https://www.npmjs.com/package/formidable
const http = require('http');
const querystring = require('querystring');
const formidable = require('formidable');
const server = http.createServer((req, res) => {
if (req.url == '/dopost' && req.method.toLowerCase() == 'post'){
var form = new formidable.IncomingForm();
// 设置文件保存路径,相对路径
form.uploadDir = "./uploads";
// 解析表单, fields表示文本域,files表示文件域
form.parse(req, function(err, fields, files) {
console.log(fields, files);
res.writeHead(200, {'content-type': 'text/plain'});
res.write('received upload:\n\n');
res.end();
});
}
});
server.listen(8080, '127.0.0.1');
这里需要使用body-parser这个中间件
const express = require('express');
// 使用中间件之前先npm install body-parser
const bodyParser = require('body-parser');
const app = new express();
//使用中间件
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json());
app.post('/', (req, res) => {
console.log(req.body);
res.send();
});
app.listen(3000);