简易Node HTTP服务
技术

简易Node HTTP服务

2023年01月09日·83 次阅读

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);

留言

0/200
还没有留言,来抢沙发吧~