Node.js中的HTTP Server对象与GET、POST请求

上一博客学习了请求与响应,2次读2次写,但有一个问题就是客户端写入的时候怎么知道请求到达。所以HTTP Server对象出现了。它提供了实现HTTP服务器的基本框架。它可以监听端口的底层套接字和接收请求,然后发送响应给客户端连接的处理程序。

它提供了一下几个事件:

  • request:当服务器收到客户端请求时触发。例如:function callback(request,response){}.
  • connection:当一个新的TCP流建立时触发。例如:function callback (socket)
  • close:服务器关闭时触发,回调不接收参数。
  • checkContinue:当收到包括期待的100-continue标头的请求时触发。即使不处理此事件,默认的事件处理程序也响应。例如:function callback(request,response){}
  • connect:接收到HTTP CONNECT请求时发出。callback接收request、response、head。例如:function callback(request,response,head)
  • upgrade:当客户端请求HTTP升级时发出。function callback (request,response,head)
  • clientError:当客户端连接套接字发出一个错误时发出。function callback(error,socket){}

要启动HTTP服务器,首先使用createServer([requestListener])方法创建对象然后通过listen(port,[hostname],[backlog],[callback]).

  • port:端口
  • hostname:主机名
  • backlog(积压):指定被允许进行排队的最大待处理连接数。默认511.
  • callback(回调):指定该服务器已经开始在指定的端口监听时,要执行的回调处理程序。

对于文件系统的连接可以用下面的两种方法:

  • listen(path,[callback]):文件路径
  • listen(handle,[callback]):接收一个已经打开的文件描述符句柄。

如果要停止监听可以使用close([callback])方法。

上面了解了下HTTP Server对象,下面用GET、POST实验一下。

GET:

var http = require("http");
var messages = [
  "Hello World",
  "From a basic Node.js server",
  "Take Luck"];
http.createServer(function (req, res) {
  res.setHeader("Content-Type", "text/html");
  res.writeHead(200);
  res.write("<html><head><title>Simple HTTP Server</title></head>");
  res.write("<body>");
  for (var idx in  messages){
    res.write("
<h1>" + messages[idx] + "</h1>");
  }
  res.end("
</body></html>");
}).listen(8080);

var options = {
    hostname: "localhost",
    port: "8080",
  };
function handleResponse(response) {
  var serverData = "";
  response.on("data", function (chunk) {
    serverData += chunk;
  });
  response.on("end", function () {
    console.log("Response Status:", response.statusCode);
    console.log("Response Headers:", response.headers);
    console.log(serverData);
  });
}
http.request(options, function(response){
  handleResponse(response);
}).end();

 输出结果:

Response Status: 200
Response Headers: { "content-type": "text/html",
  date: "Mon, 28 Mar 2016 12:51:06 GMT",
  connection: "close",
  "transfer-encoding": "chunked" }
<html><head><title>Simple HTTP Server</title></head><body>
<h1>Hello World</h1>
<h1>From a basic Node.js server</h1>
<h1>Take Luck</h1>
</body></html>

POST:

var http = require("http");
http.createServer(function (req, res) {
  var jsonData = "";
  req.on("data", function (chunk) {
    jsonData += chunk;
  });
  req.on("end", function () {
    var reqObj = JSON.parse(jsonData);
    var resObj = {
      message: "Hello " + reqObj.name,
      question: "Are you a good " + reqObj.occupation + "?"
    };
    res.writeHead(200);
    res.end(JSON.stringify(resObj));
  });
}).listen(8088);


var http = require("http");
var options = {
  host: "127.0.0.1",
  path: "/",
  port: "8088",
  method: "POST"
};
function readJSONResponse(response) {
  var responseData = "";
  response.on("data", function (chunk) {
    responseData += chunk;
  });

  response.on("end", function () {
    var dataObj = JSON.parse(responseData);
    console.log("Raw Response: " +responseData);
    console.log("Message: " + dataObj.message);
    console.log("Question: " + dataObj.question);
  });
}
var req = http.request(options, readJSONResponse);
req.write("{"name":"Bilbo", "occupation":"Burglar"}");
req.end();

输出结果:

Raw Response: {"message":"Hello Bilbo","question":"Are you a good Burglar?"}
Message: Hello Bilbo
Question: Are you a good Burglar?

第一次使用的时候用的端口号是8080,然后就报下面的错误.换一下端口号就OK了。

events.js:141
      throw er; // Unhandled "error" event
      ^

Error: listen EADDRINUSE :::8080
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1236:14)
    at listen (net.js:1272:10)
    at Server.listen (net.js:1368:5)
    at Object.<anonymous> (c:UsersAdministratorDesktop
odejs-mongodb-angularjs-web-development-masterch07http_server_post.js:16:4)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)
    at Function.Module._load (module.js:300:12)

以上基本把HTTP这块基本学了一下,对于HTTPS的话可以用HTTPS的客户端和服务端,和HTTP的差别不大,就是多了几个选项.

对于更底层的socket、tcp、udp这些就先跳过,这些做web可能也不会用到,大致学一遍之后再回过头来复习学习一下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持云海天教程。

原文地址:https://www.cnblogs.com/5ishare/p/5330614.html