我的编程空间,编程开发者的网络收藏夹
学习永远不晚

NodeJS学习笔记之Http模块

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

NodeJS学习笔记之Http模块

一,开篇分析

首先“Http”这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的,

NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自己实现的一套标准,这篇文章我们就一起来学习一下 “Http模块” 。但是作为前提来说,

希望大家可以先阅读一下官网提供的api,有一个前置了解,这样就方便多了,以下是Http部分的api概览:

HTTP

    http.STATUS_CODES

    http.createServer([requestListener])

    http.createClient([port], [host])

    Class: http.Server

    事件 : 'request'

    事件: 'connection'

    事件: 'close'

    Event: 'checkContinue'

    事件: 'connect'

    Event: 'upgrade'

    Event: 'clientError'

    server.listen(port, [hostname], [backlog], [callback])

    server.listen(path, [callback])

    server.listen(handle, [callback])

    server.close([callback])

    server.maxHeadersCount

    server.setTimeout(msecs, callback)

    server.timeout

    Class: http.ServerResponse

        事件: 'close'

        response.writeContinue()

        response.writeHead(statusCode, [reasonPhrase], [headers])

        response.setTimeout(msecs, callback)

        response.statusCode

        response.setHeader(name, value)

        response.headersSent

        response.sendDate

        response.getHeader(name)

        response.removeHeader(name)

        response.write(chunk, [encoding])

        response.addTrailers(headers)

        response.end([data], [encoding])

        http.request(options, callback)

        http.get(options, callback)

    Class: http.Agent

        new Agent([options])

        agent.maxSockets

        agent.maxFreeSockets

        agent.sockets

        agent.freeSockets

        agent.requests

        agent.destroy()

        agent.getName(options)

        http.globalAgent

    Class: http.ClientRequest

        Event 'response'

        Event: 'socket'

        事件: 'connect'

        Event: 'upgrade'

        Event: 'continue'

        request.write(chunk, [encoding])

        request.end([data], [encoding])

        request.abort()

        request.setTimeout(timeout, [callback])

        request.setNoDelay([noDelay])

        request.setSocketKeepAlive([enable], [initialDelay])

    http.IncomingMessage

        事件: 'close'

        message.httpVersion

        message.headers

        message.rawHeaders

        message.trailers

        message.rawTrailers

        message.setTimeout(msecs, callback)

        message.method

        message.url

        message.statusCode

        message.socket

让我们先从一个简单例子开始,创建一个叫server.js的文件,并写入以下代码:

var http = require('http') ;

 var server = http.createServer(function(req,res){

 res.writeHeader(200,{

     'Content-Type' : 'text/plain;charset=utf-8'  // 添加charset=utf-8

 }) ;

 res.end("Hello,大熊!") ;

 }) ;

 server.listen(8888) ;

 console.log("http server running on port 8888 ...") ;

(node server.js)以下是运行结果:

查看图片

二,细节分析实例

具体看一下这个小例子:

(1行):通过"require"引入NodeJS自带的"http"模块,并且把它赋值给http变量。

(2行):调用http模块提供的函数:"createServer" 。这个函数会返回一个新的web服务器对象。

  参数 "requestListener" 是一个函数,它将会自动加入到 "request" 事件的监听队列。

  当一个request到来时,Event-Loop会将这个Listener回调函数放入执行队列, node中所有的代码都是一个一个从执行队列中拿出来执行的。

  这些执行都是在工作线程上(Event Loop本身可以认为在一个独立的线程中,我们一般不提这个线程,而将node称呼为一个单线程的执行环境),

  所有的回调都是在一个工作线程上运行。

  我们在再来看一下"requestListener"这个回调函数,它提供了两个参数(request,response),

  每次收到一个请求时触发。注意每个连接又可能有多个请求(在keep-alive的连接中)。

  "request"是http.IncomingMessage的一个实例。"response"是http.ServerResponse的一个实例。

  一个http request对象是可读流,而http response对象则是可写流。

  一个"IncomingMessage"对象是由http.Server或http.ClientRequest创建的,

  并作为第一参数分别传递给"request"和"response"事件。

  它也可以被用来访问应答的状态,头文件和数据。

  它实现了 "Stream" 接口以及以下额外的事件,方法和属性。(具体参考api)。

(3行):“writeHeader”,使用 "response.writeHead()" 函数发送一个Http状态200和Http头的内容类型(content-type)。

  向请求回复响应头。"statusCode"是一个三位是的HTTP状态码,例如 404 。最后一个参数,"headers",是响应头的内容。

  举个栗子:

var body = 'hello world' ;

 response.writeHead(200, {

      'Content-Length': body.length,

      'Content-Type': 'text/plain' 

 }) ;

 注意:Content-Length 是以字节(byte)计算,而不是以字符(character)计算。

  之前的例子原因是字符串 “Hello World !” 只包含了单字节的字符。

  如果body包含了多字节编码的字符,就应当使用Buffer.byteLength()来确定在多字节字符编码情况下字符串的字节数。

  需要进一步说明的是Node不检查Content-Lenth属性和已传输的body长度是否吻合。

 statusCode是一个三位是的HTTP状态码, 例如:"404" 。这里要说的是 "http.STATUS_CODES" ,全部标准"Http"响应状态码的集合和简短描述都在里面。

 如下是源码参考:

var STATUS_CODES = exports.STATUS_CODES = {

  100 : 'Continue',

  101 : 'Switching Protocols',

  102 : 'Processing',                 // RFC 2518, obsoleted by RFC 4918

  200 : 'OK',

  201 : 'Created',

  202 : 'Accepted',

  203 : 'Non-Authoritative Information',

  204 : 'No Content',

  205 : 'Reset Content',

  206 : 'Partial Content',

  207 : 'Multi-Status',               // RFC 4918

  300 : 'Multiple Choices',

  301 : 'Moved Permanently',

  302 : 'Moved Temporarily',

  303 : 'See Other',

  304 : 'Not Modified',

  305 : 'Use Proxy',

  307 : 'Temporary Redirect',

  400 : 'Bad Request',

  401 : 'Unauthorized',

  402 : 'Payment Required',

  403 : 'Forbidden',

  404 : 'Not Found',

  405 : 'Method Not Allowed',

  406 : 'Not Acceptable',

  407 : 'Proxy Authentication Required',

  408 : 'Request Time-out',

  409 : 'Conflict',

  410 : 'Gone',

  411 : 'Length Required',

  412 : 'Precondition Failed',

  413 : 'Request Entity Too Large',

  414 : 'Request-URI Too Large',

  415 : 'Unsupported Media Type',

  416 : 'Requested Range Not Satisfiable',

  417 : 'Expectation Failed',

  418 : 'I'm a teapot',              // RFC 2324

  422 : 'Unprocessable Entity',       // RFC 4918

  423 : 'Locked',                     // RFC 4918

  424 : 'Failed Dependency',          // RFC 4918

  425 : 'Unordered Collection',       // RFC 4918

  426 : 'Upgrade Required',           // RFC 2817

  500 : 'Internal Server Error',

  501 : 'Not Implemented',

  502 : 'Bad Gateway',

  503 : 'Service Unavailable',

  504 : 'Gateway Time-out',

  505 : 'HTTP Version not supported',

  506 : 'Variant Also Negotiates',    // RFC 2295

  507 : 'Insufficient Storage',       // RFC 4918

  509 : 'Bandwidth Limit Exceeded',

  510 : 'Not Extended'                // RFC 2774

};

节选自,Nodejs源码 ”http.js“ 143行开始。

其实从客户端应答结果也不难看出:

查看图片

(6行):”response.end“------当所有的响应报头和报文被发送完成时这个方法将信号发送给服务器。服务器会认为这个消息完成了。

  每次响应完成之后必须调用该方法。如果指定了参数 “data” ,就相当于先调用 “response.write(data, encoding) ” 之后再调用 “response.end()” 。

(8行):”server.listen(8888)“ ------ 服务器用指定的句柄接受连接,绑定在特定的端口。

以上就是一个比较详细的分析过程,希望有助于加深理解,代码虽然不多,但是重在理解一些细节机制,以便日后高效的开发NodeJS应用。

三,实例

除了可以使用"request"对象访问请求头数据外,还能把"request"对象当作一个只读数据流来访问请求体数据。

这是一个"POST"请求的例子:

http.createServer(function (request, response) {

     var body = [];

     console.log(request.method) ;

     console.log(request.headers) ;

     request.on('data', function (chunk) {

         body.push(chunk);

     }) ;

     request.on('end', function () {

         body = Buffer.concat(body) ;

         console.log(body.toString()) ;

     });

 }).listen(8888) ;

下是一个完整的“Http”请求数据内容。

POST / HTTP/1.1

 User-Agent: curl/7.26.0

 Host: localhost

 Accept: */*

 Content-Length: 11

 Content-Type: application/x-www-form-urlencoded

 Hello World

四,总结一下

(1),理解 "Http" 概念。
(2),熟练使用 "Http" 相关的api。
(3),注意细节的把控,比如:“POST,GET” 之间的处理细节。
(4),"requestListener"的理解。
(5),强调一个概念:一个http request对象是可读流,而http response对象则是可写流 。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

NodeJS学习笔记之Http模块

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

NodeJS学习笔记之Http模块

一,开篇分析 首先“Http”这个概念大家应该比较熟悉了,它不是基于特定语言的,是一个通用的应用层协议,不同语言有不同的实现细节,但是万变不离其宗,思想是相同的, NodeJS作为一个宿主运行环境,以JavaScript为宿主语言,它也有自
2022-06-04

NodeJS学习笔记之MongoDB模块

一,开篇分析 这篇属于扩展知识篇,因为在下面的文章中会用到数据库操作,所以今天就来说说它(Mongodb模块)。 (1),简介MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方
2022-06-04

Nodejs学习笔记之Stream模块

一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现。比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流。流是可读,可写或兼具两者的。 最早接触Stream是从早期的unix开始的, 数十年的实践证明Strea
2022-06-04

Nodejs学习笔记之NET模块

一,开篇分析 从今天开始,我们来深入具体的模块学习,这篇文章是这个系列文章的第三篇,前两篇主要是以理论为主,相信大家在前两篇的学习中, 对NodeJS也有一个基本的认识,没事!!!趁热打铁,让我们继续将NodeJS进行到底,好了废话不多说,
2022-06-04

NodeJS学习笔记之FS文件模块

一,开篇分析 文件系统模块是一个简单包装的标准 POSIX 文件 I/O 操作方法集。可以通过调用 require("fs") 来获取该模块。文件系统模块中的所有方法均有异步和同步版本。 (1),文件系统模块中的异步方法需要一个完成时的回调
2022-06-04

NodeJS学习笔记之(Url,QueryString,Path)模块

一,开篇分析 这篇文章把这三个模块拿来一起说,原因是它们各自的篇幅都不是很长,其次是它们之间存在着依赖关系,所以依次介绍并且实例分析。废话不多说了,请看下面文档: (1),"Url模块"来个小栗子:  var url = require('
2022-06-04

NodeJS学习笔记之Connect中间件模块(二)

一,开篇分析 大家好,今天这篇文章主要是对"Connect"中间件以及相关辅助中间件,做一个源码分析系列,我想上一篇文章大家也看了, 介绍了使用方式及用途,而这篇也是出于本人的兴趣,让读者对其有一个更深入的认识,如在分析阶段有什么不正确的地
2022-06-04

NodeJS学习笔记之Connect中间件模块(一)

希望大家能够坚持看下去我这系列的文章,这也是对我的最大的鼓励与支持,让我们共同进步,以文会友,相互帮助。好了直接进入今天的主题, 什么是“Connect”,中间件又当如何理解,带着问题来看今天的文章。如何理解 "中间件" 我的理解是这样的
2022-06-04

Python学习笔记之json模块和pickle模块

json和pickle模块是将数据进行序列化处理,并进行网络传输或存入硬盘,下面这篇文章主要给大家介绍了关于Python学习笔记之json模块和pickle模块的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-18

nodejs学习笔记之路由

server.jsvar http = require("http"); var url = require("url"); function start(route){//route.js 的route方法//服务实现function o
2022-06-04

python学习笔记(九)、模块

1 模块  使用import 语句从外部导入模块信息,python提供了很大内置模块。当你导入模块时,你会发现其所在目录中,除源代码文件外,还新建了一个名为__pycache__的子目录(在较旧的Python版本中,是扩展名为.pyc 的文
2023-01-31

Nodejs学习笔记之入门篇

分享第一篇,关于 NodeJS —— Javascript 的常用知识以及如何从 Javascript 开发者过渡到 NodeJS 开发者(不会介绍具体的框架)。在读本文前,希望你对 javascript 有一些初步的认识。 Javascr
2022-06-04

python zipfile模块学习笔记

ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建、读取、写入、附加和列出一个ZIP文件。使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程很慢。1、测试是否为ZIP文件is_zi
2023-01-31

python os模块学习笔记

import os os.mkdir(name) #创建目录 os.path.exists(name) #判断文件或者目录是否存在 os.path.isdir(name) #判断指定对象是否为目录。是True,否则Fa
2023-01-31

Python 学习笔记 (4)—— 模块

模块基本上就是一个包含了所有你定义的函数和变量的文件。为了在其他程序中重用模块,模块的文件名必须以.py为扩展名。        模块可以从其他程序 输入 以便利用它的功能。这也是我们使用Python标准库的方法。首先,我们将学习如何使用标
2023-01-31

Python3学习笔记(urllib模块

1.基本方法urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)-    
2023-01-31

【Apollo学习笔记】——规划模块TASK之PATH_DECIDER

文章目录 前言PATH_DECIDER功能简介PATH_DECIDER相关配置PATH_DECIDER总体流程路径决策代码流程及框架MakeStaticObstacleDecision PATH_DECIDER相关子函数参考
2023-08-30

nodejs模块学习之connect解析

nodejs 发展很快,从 npm 上面的包托管数量就可以看出来。不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创造大量的轮子来解决现实的问题。 知其然,并知其所以然这是程序员的天性。所以把常用的模块拿出来看看,看看
2022-06-04

NodeJS学习笔记之Module的简介

Node.js模块系统 Node.js有一个简单的模块加载系统。 在Node.js中,文件和模块是一一对应的(每个文件被视为单独的模块)。 例如,考虑下面这个名为 foo.js 的文件:const circle = require('./c
2022-06-04

NodeJS学习笔记之网络编程

Node提供丰富的网络编程模块Node模块协议netTCPdgramUDPhttpHTTPhttpsHTTPSTCP服务事件分为下面两类 (1)、服务器事件 对于通过net.createServer()创建的服务器而言,它是一个EventE
2022-06-04

编程热搜

目录