HTTP(hypertext transport protocol)协议也叫超文本传输协议,是一种基于 TCP/IP 的应用层通信协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。
协议主要规定了两方面的内容
- 客户端向服务器发送数据,称之为请求报文
- 服务器向客户端返回数据,称之为响应报文
HTTP 请求报文包括四部分
- 请求行
- 请求头
- 空行
- 请求体
HTTP 响应报文也包括四个部分
- 响应行
- 响应头
- 空行
- 响应体
使用 nodejs 创建 HTTP 服务器
//1. 引入 http 内置模块
var http = require('http');
//2. 创建服务
var server = http.createServer(function(request, response){
response.end('hello world!!');
});
//3. 监听端口
server.listen(8000);
- request 是对请求报文的封装对象
- response 是对响应的封装对象
获取请求
//获取请求方法
console.log(request.method);
//获取http版本
console.log(request.httpVersion);
//获取请求路径
console.log(request.url);
//获取请求头
console.log(request.headers);
//获取请求体
request.on('data', function(chunk){})
request.on('end', function(){});
设置响应
//设置状态码
response.statusCode = 200;
//设置响应头
response.setHeader('content-type','text/html;charset-utf-8');
//设置响应体
response.write('body');
//结束
response.end();
#### 创建http服务
```javascript
// 1.引入http 模块
const http = require('http');
// 2.调用方法 创建服务对象
/*
request :发送报文的封装对象
response : 响应报文的封装对象
*/
const ws = http.createServer(function(request,response){
// 响应报文
response.end('hello 你好');
})
// 3.监听端口 启动服务
// 127.0.0.1是回环地址 在主机上发送给127开头的IP地址的数据包会被发送的主机自己接收,根本传不出去,外部设备也无法通过回环地址访问到本机,此ip地址有网无网都可以访问
// 默认端口号:80
// ctrl + c 停止服务
ws.listen(80,function(){
console.log('服务启动,端口8000监听中');
})
获取请求信息
// 引入http模块
const http = require('http');
// 引入url模块
const url = require('url');
// 创建服务对象
const ws = http.createServer((request,response)=>{
// 获取请求类型
// console.log(request.method);
// 获取请求的URL
// console.log(request.url);
// 获取请求的http协议版本
// console.log(request.httpVersion);
// 获取url内部各部分的信息
// 获取路径
console.log(url.parse(request.url).pathname);
// 获取rul中的查询字符串
console.log(url.parse(request.url,true).query);
// 请求头信息
console.log(request.headers);
// 响应报文
response.end('hello');
})
// 监听端口
ws.listen(8001,()=>{
console.log('端口监听ing');
})
//获取请求体
//引入http模块
const http = require('http');
// 创建服务对象
// 引入
const ps = require('querystring');
const ws = http.createServer((request,response)=>{
//绑定data事件
let body = '';
request.on('data',chunk=>{
body += chunk.toString();
})
// 3.绑定end事件
request.on('end',()=>{
console.log(body);
console.log( ps.parse(body));
response.end('body server1');
})
})
// 端口监听
ws.listen(80,()=>{
});
获取响应信息
/ 引入http模块
const http = require('http');
// 引入url模块
const url = require('url');
// 引入fs 模块
const fs = require('fs');
const ws = http.createServer((request,response)=>{
// 获取请求的URl中的查询路径
let pathname = url.parse(request.url,true).pathname;
// 网站的根目录 服务器根据请求路径找到指定文件夹下面的文件,那么这个文件夹就是该网站的跟目录
let directory = __dirname +'public';
// let directory = 'D:/';
let pathName = directory + pathname;
fs.readFile(pathName,(err,data)=>{
if(err) {
response.end('404 Not Found');
} else {
response.end(data);
}
})
/* let data = fs.readFileSync(pathName);
response.end(data); */
/* if(pathname === '/index.html'){
let data = fs.readFileSync(pathName);
// 返回响应体
response.end(data);
}else if(pathname === '/css/app.css') {
let data = fs.readFileSync(__dirname + '/public/css/app.css');
// 返回响应体
response.end(data);
}else if(pathname === '/css/font.css') {
let data = fs.readFileSync(__dirname + '/public/css/font.css');
// 返回响应体
response.end(data);
}else if(pathname === '/js/index.js') {
let data = fs.readFileSync(__dirname + '/public/js/index.js');
// 返回响应体
response.end(data);
} */
/* else {
response.end('404 Not Found');
} */
})
ws.listen(80);