笔记-Node.js中的核心API之HTTP
最近正在学习Node,在图书馆借了基本关于Node的书,同时在网上查阅资料,颇有收获,但是整体感觉对Node的理解还是停留在一个很模棱两可的状态。比如Node中的模块,平时练习就接触到那么几个,其他的一些模块暂时只会在学习的时候接触到,不常用便就荒废了。正所谓好记心不如烂笔头,多做笔记还是更有利于理解和记忆。自己做的总结也方便回头复习,所以决定踏上漫长的修炼之旅……
Node提供了许多API,其中一些比较重要。这些核心的API是所有Node应用的支柱,你会不停的用到他们。
HTTP服务器
Node.js的核心功能之一就是作为web服务器,在Node的标准库中提供了http模块,其中封装了一个高效的HTTP服务器和一个简易的HTTP客户端。就像之前说过的:Node.js 可以作为服务器提供服务,他跳过了类似 Apache,IIS 等 HTTP 服务器,内建了 HTTP 服务器支持,无需额外搭建一个 HTTP 服务器,便可以轻而易举地实现网站和服务器的组合。
Node中的HTTP接口的被设计成可以支持许多HTTP协议中原本用起来很困难的特性,特别是对于很大的或者块编码的消息.这些接口不会完全缓存整个请求(request)或响应(response),这样用户可以在请求(request)或响应(response)中使用数据流。若想使用Node中的HTTP服务或客户端功能,需引用此模块require('http')
。
In order to support the full spectrum of possible HTTP applications, Node's HTTP API is very low-level. It deals with stream handling and message parsing only. It parses a message into headers and body but it does not parse the actual headers or the body.
为了能全面地支持可能的HTTP应用程序,Node提供的HTTP API都很底层。它只处理流处理和消息解析。它把一份消息解析成报文头和报文体,但是它不解析实际的报文头和报文体。
http.Server
先用Node来创建一个简单的HTTP服务器:
var http=require("http");
http.createServer(function(request,response){
response.writeHead(200,{
"Content-Type":"text/html"
});
response.write("<h1>Hello, CrispElite</h1>");
response.end("<p>Bye bye!</p>");
}).listen(3000);
console.log("你的服务器已经启动!");
利用 http.createServer() 创建了一个 http.Server 的实例,将一个匿名函数用了处理请求。这个函数接收两个参数:请求对象和响应对象。createServer() 返回的还是 http.Server 的实例,方便链式调用。这个例子中,在 createServer() 之后直接调用了 http.Server 的 listen() 方法,监听3000端口。
http.Server 是 http 模块中的 HTTP 服务器对象。它继承自 EventEmitter,有用一套属于它自己的事件。最常用的当属request
:当客户端请求到来的时候,request 事件被触发,提供两个参数 request 和 response 给回调函数,表示请求和响应的信息。createServer(callback) 方法是Node为 request 提供的一个快捷方法,其功能是创建一个 HTTP 服务器并将 callback 作为 reuqest 事件的监听函数,就想上面的例子一样。如果要显示的使用 request 事件来实现,其实就是这么回事:
var http=require("http"),
server=new http.Server();
server.on("request", function(request,response){
response.writeHead(200,{
"Content-Type":"text/html"
});
response.write("<h1>Hello, CrispElite</h1>");
response.end("<p>Bye bye!</p>");
});
server.listen(3000);
console.log("你的服务器已经启动!");
http.ServerResponse
http.ServerResponse 是服务器返回给客户端的信息。一个由HTTP服务器内部创建的对象(不是由用户创建)。它将作为第二个参数传递到前面所说的 'request' 事件的监听器中。
http.ServerResponse 有很多方法,具体请戳这里,其中有几个比较重要的成员函数。
response.writeHead(statusCode, [header])
向请求的客户端发送响应头。这个函数在一个请求中最多只能调用一次,如果不调用则会自动生成一个响应头。注意,必须在调用 end()之前调用。
var body = 'hello world';
response.writeHead(200, {
'Content-Length': body.length,
'Content-Type': 'text/plain'
});
要注意的是,Content-Length 以字节为单位而不是字符。上面的例子能够工作,是因为字符串 'hello world' 只包含单字节字符。如果报文主体内包含高位数的编码字符,然后就要使用Buffer.byteLength()来确定在给定编码格式下的字节数。原文。
response.write(data, [encoding])
向请求的客户端发送响应内容。data 可以是一个 Buffer 或者字符串,表示要发送的内容,如果是字符串则需指定 encoding,默认是 utf-8。在 response.end() 调用之前,可以多次调用 write()。第一次调用 write() 时,它将发送缓冲的报头信息和第一个报文主体到客户端。当 write() 第二次被调用时,Node会假设你将要使用流数据,然后自动将响应内容分开发送。也就是说,响应被缓存到报文主体的第一块中。原文。
Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all or part of the data was queued in user memory. 'drain' will be emitted when the buffer is again free.
response.end([data], [encoding])
用于结束响应,通知客户端所有的发送已经完成。接收两个可选参数,意义和 write() 方法相同。这个函数在一个请求中必须被调用一次,如果不调用客户端将永远处于等待状态。
http.ServerResponse 也继承了 EventEmitter ,在官方的API文档中,目前(2015/05/13)只提供了两个事件:close和finish。
Event:'close'
表明在 ServerResponse 的 end 方法被调用或者刷新之前,相关的连接已经被终止。
Event:'finish'
当响应信息已经成功发送之后触发 finish 事件。更具体一点来说,当响应的报文头和报文体的最后一个分段被移交到操作系统用于网络传输时被触发。原文。
HTTP客户端
http模块提供了两个函数 http.request
,http.get
,其作用是作为客户端向HTTP服务器发起请求。
http.request(options, callback)
发起HTTP请求,接受两个参数。options可以是一个对象或一个字符串。如果options是一个字符串, 它将自动使用url.parse()解析;callback是请求的回调函数。
options的常用参数如下:
- host:请求发送到的服务器的域名或IP地址。默认为'localhost'。
- hostname:用于支持url.parse()。hostname比host更好一些
- port:远程服务器的端口。默认值为80。
- method:指定HTTP请求方法的字符串。默认为'GET'。
- path:请求路径。默认为'/'。如果有查询字符串,则需要包含。例如'/index.html?page=12'。
- headers:包含请求头的对象。
使用 http.request() 时,必须调用 response.end(),以此来向服务器表明请求结束,即使请求的主体中没有任何数据。
http.get(options, callback)
因为大部分请求都是没有主体的GET请求,所以 Node 提供了这个方便的方法。它与 http.request() 唯一的区别就是自动将请求设为GET请求,同时自动调用 response.end()。
http.get("http://www.google.com/index.html", function(res) {
console.log("Got response: " + res.statusCode);
}).on('error', function(e) {
console.log("Got error: " + e.message);
});
http.ClientRequest
http.ClientRequest 是 Node 内建的一个对象,调用 http.request() 和 http.get() 返回的就是这个对象。它表示一个已经产生并且正在进行的 HTTP 请求。它提供了一个 response 事件,当响应头被接收的时候,会在请求的对象上触发。http.request() 和 http.get() 第二个参数指定的回调函数的绑定对象就是它了。http.ClientRequest 和 http.ServerResponse 一样提供了 write() 和 end() 用于向服务器发送请求体。所有的写结束后必须调用 end() 通知服务器。更多详细信息请戳这里。
关于 Node 中的 HTTP 模块肯定不止上面说到的这些,上面所讲到的只是一些常用的内容,通常用来处理简单的内容。如果想构建复杂的,全面的 Web 服务器,远远不够。当需要的时候多翻翻手册,熟能生巧~
笔记-Node.js中的核心API之HTTP的更多相关文章
- [学习笔记]node.js中的path.extname方法
path.extname 返回path路径文件扩展名,如果path以 ‘.' 为结尾,将返回 ‘.',如果无扩展名 又 不以'.'结尾,将返回空值. path.extname('index.html' ...
- 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
[摘要] 官网博文翻译,nodejs中的定时器 示例代码托管在:http://www.github.com/dashnowords/blogs 原文地址:https://nodejs.org/en/d ...
- 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
目录 Event Loop 是什么? Event Loop 基本解释 事件循环阶段概览 事件循环细节 timers pending callbacks poll阶段 check close callb ...
- node.js中的回调
同步和阻塞:这两个术语可以互换使用,指的是代码的执行会在函数返回之前停止.如果某个操作阻塞,那么脚本就无法继续,这意味着必须等待. 异步和非阻塞:这两个术语可以互换使用,指的是基于回调的.允许脚本并行 ...
- Node.js 中的进程和线程
线程和进程是计算机操作系统的基础概念,在程序员中属于高频词汇,那如何理解呢?Node.js 中的进程和线程又是怎样的呢? 一.进程和线程 1.1.专业性文字定义 进程(Process),进程是计算机中 ...
- 初步揭秘node.js中的事件
当你学习node.js的时候,Events是一个非常重要的需要理解的事情.非常多的Node对象触发事件,你能在文档API中找到很多例子.但是关于如何写自己的事件和监听,你可能还不太清楚.如果你不了解, ...
- 在Node.js中使用RabbitMQ系列二 任务队列
在上一篇文章在Node.js中使用RabbitMQ系列一 Hello world我有使用一个任务队列,不过当时的场景是将消息发送给一个消费者,本篇文章我将讨论有多个消费者的场景. 其实,任务队列最核心 ...
- 关于Node.js中的路径问题
在前端学习过程中,涉及到路径的问题非常多,相对路径,绝对路径等.有时候明明觉得没问题,但是还是会出错.或者说线下没问题,但是到了线上就出现问题,因此弄懂路径问题,非常关键.我们需要知道为什么这个地方既 ...
- 浏览器中的 JS 和 Node.js 中的 JS
一个是前端技术,一个是后端技术 浏览器中的 JavaScript ECMAScript 语言基础,如语法.数据类型结构.一些内置对象 BOM(Browser Object Model) 一些操作页 ...
随机推荐
- Python核心编程笔记--随机数
#第一步引入模块 import random #第二步生成随机数 print random.randint(1,3);#[1,2,3]注意这里是闭区间.
- 限制Inactive物料录入BOM
应用 Oracle Bill Of Materiel 层 Level Function 函数名 Funcgtion Name CUX_BOMFDBOM 表单名 Form Name CUXBOMFD ...
- 关于javascript跨域及JSONP的原理与应用
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有的可支持javascript的浏览器都会使用这个策略. 为什么需要同源策略,这里举个例子: 假 设现在没有同源策略,会发生什么事情呢? ...
- ldap for ruby
Net::LDAP for Ruby (also called net-ldap) implements client access for the Lightweight Directory Acc ...
- B. Wet Shark and Bishops(思维)
B. Wet Shark and Bishops time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- Leetcode:Swap Nodes in Pairs 单链表相邻两节点逆置
Given a linked list, swap every two adjacent nodes and return its head. For example, Given 1->2-& ...
- 各类形参(引用,const,指针)
#include <stdlib.h> #include <iostream> //这是一个关于引用形参,const形参,指针形参的程序,用于理解不同形式的区别 using n ...
- 初学JSoup
jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址.HTML 文本内容.它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出 ...
- 20141014C#面向对象抽象方法,抽象类,接口
里氏代换原则.可以用子类的对象替代父类的对象. 抽象依赖原则.依赖——形参,关联 一.抽象方法: 在一些父类中,某些行为不是非常明确,因此无法用代码来具体实现,但是类必须具备此方法,因此把这样的方法定 ...
- IOS--当字符串返回的数据格式为xml/html时
今天一来办公室就接到客户返回的BUG,其中一个是因为后台返回的字符串中的数据为xml/html格式. 后来经过百度,发现了两种解决方法,第一种是使用webView,webView中专门为了这种情况准 ...