环境:Nodev8.2.1;Npmv5.3.0;OSWindows10的客户端和服务器我们都很熟悉,Node.js中的HTTP接口旨在支持该协议的许多特性。例如,块编码消息。这些接口不缓冲完整的请求或响应,用户可以以流的形式处理数据。为了支持所有可能的HTTP应用程序,Node.js的HTTPAPI非常低级。它只处理流处理和消息解析。它将消息解析为消息头和消息体,但不解析具体的消息头或消息体。1.API结构图由于本模块内容较多,我将图片分开上传,避免图片过于密集。1.1Module类结构1.2Agent类结构1.3ClientRequest类结构1.4Server类结构1.5ServerResponse类结构1.6IncomingMessage类结构1.7静态方法和属性擦除以上类之间的关系,从一个简单的例子开始2.1简单和核心的例子consthttp=require("http");//serverconstserver=http.createServer((clientReq,serverRes)=>{serverRes.end();}).listen(3000)//clientconstclient=http.get("http://localhost:3000",(clientRes)=>{})上面简单的几行代码就成功创建了一个服务器和一个客户端,看似简单,其实不然。上面的代码一共创建了4个实例,可以和上图对比。server:http.Server类的一个实例,用于提供服务和处理客户端请求。client:http.ClientRequest类的实例,用于向服务端发起请求clientReq/clientRes:http.IncomingMessage类的实例,[clientReq]用于服务端获取客户端请求的信息,[clientRes]用于客户端获取服务serverRes返回的相关消息:http.ServerResponse类实例,服务器用于响应客户端请求。贴一下框架,里面的具体内容就不贴了,贴出来感觉乱七八糟。http.IncomingMessage类继承stream.Readable:exportclassIncomingMessageextendsstream.Readable{}http.ServerResponse类继承stream.Writable:exportclassOutgoingMessageextendsstream.Writable{}exportclassServerResponseextendsOutgoingMessage{}3.一些示例如下遵循API示例,一些API的简单代码实现3.1服务器属性consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.end();})server.listen(3000);console.log("listening:"+server.listening);console.log("maxHeadersCount:"+server.maxHeadersCount);console.log("超时:"+server.timeout);console.log("keepAliveTimeout:"+server.keepAliveTimeout);//listening:true//maxHeadersCount:null(nolimit)//timeout:120000//keepAliveTimeout:50003.2服务器事件consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.end();}).listen(3000);server.on("request",(request,response)=>{console.log("服务器收到请求");})服务器。on("connection",socket=>{//超过默认5000ms关闭TCP流,再次请求时重新建立console.log("建立新的TCP流");})3.3serverResponse属性consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.writeHead(200,{'Content-Type':'text/plain'});ServerResponse.write("helloworld");console.log("connection:"+ServerResponse.connection);console.log("finished:"+ServerResponse.finished);console.log("headersSent:"+ServerResponse.headersSent);console.log("sendDate:"+ServerResponse.sendDate);console.log("socket:"+ServerResponse.socket);console.log("statusCode:"+ServerResponse.statusCode);console.log("statusMessage:"+ServerResponse.statusMessage);ServerResponse.end();console.log("finished:"+ServerResponse.finished);}).listen(3000);/*connection:[objectObject]finished:falseheadersSent:truesendDate:truesocket:[objectObject]statusCode:200statusMessage:OKfinished:true*/3.4addTrailers()consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.writeHead(200,{'Content-Type':'text/plain'});ServerResponse.write("helloworld");ServerResponse.addTrailers({'Content-MD5':'7895bf4b8828b55ceaf47747b4bca667'})ServerResponse.end();}).listen(3000);3.5getHeader()consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.setHeader("foo","bar");ServerResponse.writeHead(200,{'Content-Type':'text/plain'});ServerResponse.write("helloworld");console.log(ServerResponse.getHeader("foo"));ServerResponse.end();}).listen(3000);3.6getHeaderNames()consthttp=require("http");constserver=http.createServer((ClientRequest,ServerResponse)=>{ServerResponse.setHeader("foo","bar");ServerResponse.writeHead(200,{'内容-类型':'文本/纯文本'});ServerResponse.write("你好世界");console.log(ServerResponse.getHeaderNames());//['foo','content-type']ServerResponse.end();}).listen(3000);3.7get()consthttp=require("http");constClientRequest=http.get("http://localhost:3000",res=>{res.setEncoding("utf8")letrawData='';res.on("data",chunk=>{rawData+=chunk;})res.on("end",()=>{console.log(rawData);})})ClientRequest.on("response",(imsg)=>{console.log("接收响应");})3.8http.request摘一个官方例子^_^constpostData=querystring.stringify({'msg':'HelloWorld!'});constoptions={hostname:'www.google.com',port:80,path:'/upload',方法:'POST',标头:{'Content-Type':'application/x-www-form-urlencoded','Content-Length':Buffer.byteLength(postData)}};constreq=http.request(options,(res)=>{console.log(`状态码:${res.statusCode}`);console.log(`响应头:${JSON.stringify(res.headers)}`);res.setEncoding('utf8');res.on('data',(chunk)=>{console.log(`响应正文:${chunk}`);});res.on('end',()=>{console.log('响应中没有更多数据');});});req.on('error',(e)=>{console.error(`Therequestencounteredaproblem:${e.message}`);});//向请求体写入数据req.write(postData);req.end();
