
简易Node HTTP服务
HTTP模块
node内置http模块,可以很方便的搭建http服务。
javascript
const http = require('http');
const server = http.createServer((req, res) => {
let data = '';
req.on('data', (chunk) => {
data += chunk;
})
req.on('end', () => {
let {method,url,httpVersion,} = req;
let headers = req.headers;
res.writeHead(200, {'Content-Type': 'text/html'});
const dataHtml = `<p>data:${data}</p>`
const methodHtml = `<p>method:${method}</p>`
const urlHtml = `<p>url:${url}</p>`
const httpVersionHtml = `<p>httpVersion:${httpVersion}</p>`
const headersHtml = `<p>headers:${JSON.stringify(headers)}</p>`
res.end(`${dataHtml}${methodHtml}${urlHtml}${httpVersionHtml}${headersHtml}`);
})
}).listen(8080);
http.Server
事件列表
- request
- connection
- close
- request
- upgrade
- clientError
http.ServerRequest
事件列表
- data
- end
request对象
- request.method
- request.url
如果你想要解析这个URL 中的各个部分,你应当使用require('url').parse(request.url)
require('url').parse('/status?name=ryan', true) - request.headers
- request.httpVersion
- request.setEncoding(encoding='null')
- request.pause()
- request.resume()
- request.connection
http.ServerResponse
用来操作返回的数据。
- response.writeHead(statusCode, [reasonPhrase], [headers])
- response.end([data], [encoding])
http.Client
创建http客户端,可以用来创建代理。
javascript
var http = require('http');
var google = http.createClient(80, 'www.google.com');
var request = google.request('GET', '/',
{'host': 'www.google.com'});
request.end();
request.on('response', function (response) {
console.log('STATUS: ' + response.statusCode);
console.log('HEADERS: ' + JSON.stringify(response.headers));
response.setEncoding('utf8');
response.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
- upgrade
- http.createClient(port, host='localhost', secure=false, [credentials])
- client.request(method='GET', path, [request_headers])
- client.verifyPeer()
- client.getPeerCertificate()
http.ClientRequest
javascript
request.on('response', function (response) {
response.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
- response
- request.write(chunk, encoding='utf8')
- request.end([data], [encoding])
http.ClientResponse
- Event: 'data'
- Event: 'end'
- response.statusCode
- response.httpVersion
- response.headers
- response.setEncoding(encoding='null')
- response.pause()
- response.resume()
- response.client
language
const http = require("http");
const url = require("url");
//首先启动本地服务器
http.createServer(function(req, res) {
//客户端请求有两种方式,可以是对象,也可以是url字符串
//1.这里采取的是对象形式,包括url对象以及headers
var options = url.parse(req.url);
options.headers = req.headers;
//2.如果采取字符串形式,就传入一个完整的url字符串,node会自动解析成url对象
//通过客户端请求新建一个代理服务器
//代理请求仿照本地请求头的数据
var proxyRequest = http.request(options, function(proxyResponse) { //代理请求获取的数据再返回给本地res
proxyResponse.on('data', function(chunk) {
console.log('proxyResponse length:', chunk.length);
res.write(chunk, 'binary');
});
//当代理请求不再收到新的数据,告知本地res数据写入完毕。
proxyResponse.on('end', function() {
console.log('proxied request ended');
res.end();
});
res.writeHead(proxyResponse.statusCode, proxyResponse.headers);
});
//data只有当请求体数据进来时才会触发
//尽管没有请求体数据进来,data还是要写,否则不会触发end事件
req.on('data', function(chunk) {
console.log('in request length:', chunk.length);
proxyRequest.write(chunk, 'binary');
});
req.on('end', function() {
//向proxy发送求情,这里end方法必须被调用才能发起代理请求
//所有的客户端请求都需要通过end来发起
proxyRequest.end();
});
}).listen(8080);
留言