上篇介绍了UDP协议通信,本篇介绍Http协议:一种通用、无状态的应用层协议。
服务端代码如下:
/**
* Http 服务端
*/
const http = require("http");
const url = require("url");
const querystring = require('querystring');
//服务器创建
const server = http.createServer((req,res)=>{
let reqUrl = decodeURI(req.url);
reqUrl = url.parse(reqUrl);
console.log("web 客户端url="+req.url);
let data = "";
req.on("data",(chunk)=>{
data += chunk;
});
req.on("end",()=>{
data = decodeURI(data);
let dataObj = querystring.parse(data);
console.log("web 客户端数据:",dataObj);
res.writeHead(200,{"Content-Type":"text/html;charset=utf-8"});
res.write("Hello!");
res.end("响应完毕\n");
});
});
server.listen(8080,()=>{
console.log("服务器已经启动!");
});
server.on("error",(err)=>{
console.error("服务器错误:",err.message);
});
//服务器关闭
// server.close();
客户端代码如下:
/**
* Http请求客户端
*/
const http = require("http");
//--------Post请求【键值对形式表单】-------------------
const querystring = require("querystring");
//将要提交的数据转换为查询字符串
const postData = querystring.stringify({"msg":"你好!我是Http客户端"});
//发送请求设置
const options = {
hostname:"127.0.0.1",
port:8080,
path:"/upload",
method:"POST",
headers:{
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
'Content-Length': Buffer.byteLength(postData)
}
}
//创建Post请求
const req = http.request(options,(res)=>{
console.log("服务器返回状态码:",res.statusCode);
console.log("服务器返回响应头:",JSON.stringify(res.headers));
let data ="";
res.setEncoding("utf8");
res.on("data",(chunk)=>{
data += chunk;
});
res.on("end",()=>{
console.log("服务器返回响应体数据:"+data);
});
});
req.on("error",(err)=>{
console.error("客户端错误:",err.message);
if(err)
{
req.destroy();//终止当前请求
}
});
req.on("abort",()=>{
console.log("客户端终止请求!");
});
req.on("timeout",()=>{
console.log("客户端请求超时!");
});
req.setTimeout(3000);
//post请求携带的参数是类似键值对对象组
req.write(postData);
req.end();
//----------------Get请求【以?分割URL和传输数据,参数之间以&相连】----------
const options2 = {
hostname: '127.0.0.1',
port: 8080,
path: encodeURI('/index.html?page=12&stats=打开')
};
const req2 = http.get(options2,(res)=>{
let data = "";
res.on("data",(chunk)=>{
data += chunk;
});
res.on("end",()=>{
console.log("服务器返回响应体数据:",data);
});
});
req2.on("error",(err)=>{
console.log("出现错误:",err.message);
});
运行结果如下
【服务端】
【客户端】
?
Node.js内置了http模块,因此无需安装第3方的包。http常用请求方式:get与post,它们的主要区别在于携带请求参数的不同,前者是拼接在url后,后者是以表单键值对象方式。?
|