Node中的http模块
通过Node模块,我们可以实现客户端和服务器端。这篇文章主要研究如何利用http和一些相关模块构建客户端和服务器端代码。读完本文,将能够实现client向server发送数据,而server将数据原样返回。
***********************************************************************************
服务器端
首先介绍几个方法。
- http的createServer方法
var server = http.createServer(requestListener(request,response)),这个方法做了两件事情:1. 创建服务器;2.定义了收到请求后(请求到来时)服务器如何处理,request指的是客户端发过来的请求(输入流),response指服务器对客户端的响应(输出流)。
通过request, 我们可以得到请求的相关信息。request.method代表请求的方法名(post / get / delete / put...), request.url代表请求的路径名(不包含hostname和port),request.headers返回请求头部对象,而request.httpVersion是请求的http版本号。request.headers里包含这十分丰富的信息,例如:
{ host: 'localhost:8000', //主机名和端口号
connection: 'keep-alive',
'cache-control': 'max-age=0',//缓存相关
accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', //客户端能够接收的媒体类型(MIME)和优先级,默认为1;表示优先接受text/html、application/ xhtml+xml、image/webp类型(q=1),其次为application/xml类型(q=0.9),如果这些都没有,那就随便什么类型了(q=0.8)
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36',//客户端类型,表示为chrome桌面板
'accept-encoding': 'gzip, deflate, sdch',//客户端支持的内容压缩编码格式
'accept-language': 'en-US,en;q=0.8',//客户端使用的语言及其优先级
}
通过response,可以设置响应部分。response.writeHead(statusCode, statusText, options)方法可以设置响应状态码和描述信息,在options中可以添加自定义头部或者给头部赋值。writeHead和setHeader不同,前者是直接把响应头部发送出去了,而后者只是设置,所以一旦使用了writeHead,接下来想再次修改头部就不可能了,比如在writeHead之后想要通过getHeader("name")或者removeHeader("name")是不可能成功的,因为已经把头发送出去了,如果真的想这么做,就请用setHeader。用法如下:
response.writeHead(200, "quite good", {"name":"test", “content-type":"application/json"}); response.setHeader("name","test"); response.setHeader("age","16")
writeHead还有一个有用的用法,就是设置重定向。response.writeHead(301, "moved forever", {location: "http://www.baidu.com"}), 如果客户端访问服务器的地址,就会被导航到baidu。
- server的listen方法
server.listen(port, hostname, queue, callback),port是服务器监听的端口号,hostname为服务器主机名,默认为localhost,queue为队列中等待的连接数上限(默认为511),callback为服务器成功启动(服务器启动时)的回调函数。一般情况下,hostname和queue就采用默认值。
*****************************************************************************************
客户端
客户端要完成的是向服务器发送请求。这种利用node构建客户端的方式其实是把node作为中间层,一个好处是避免了前端请求的跨域问题。在进一步开始之前,先学习一下http.request方法。
var client = http.request(options,callback);options是一个对象,常用的属性包括:
hostname: 表示请求网站的主机名或者域名,默认为localhost
port: 服务端口号
method: http方法,get, post,
path: 路径名
headers: 请求头
而callback是一个回调函数,参数response是一个可读流,可以用可读流的data事件取出响应体。
和createServer相对应地,http.request返回一个客户端类型client,client是可写流,可以通过可写流的write方法写入具体的内容,也可以用end方法结束写入client。
最后,我们用以上提到的方法完成:客户端向服务器发送json对象,服务器读取后再把对象返回给客户端。
客户端代码为:
var http=require('http');
var options={
method:"get",
hostname:"localhost",
port:9090,
path:"/user",
headers:{
"Content-Type":"application/json"
}
}
var client = http.request(options,function(response){ //client是一个可写流
response.on("data",function(data){ //读取响应体数据
console.log(data.toString("utf-8"));//将二进制数据转化成字符串
})
});
client.write(JSON.stringify({"name":"Lily"}));//给请求体写数据,数据类型为buffer或者string
client.end();//结束写入请求体并发送请求
服务器端代码为:
var http = require("http");
var server = http.createServer(function (req, res) {
if (req.method == "POST" && req.url == "/user") {//向user提交数据
req.on("data", function (data) {
var str = "request content is " + data;//这里因为有字符串拼接,所以data就直接由二进制转为字符串了
res.write(str);
res.end();
});
} else { //请求路径不是user,则返回404
res.statusCode = 404;
res.end();
}
});
server.listen(9090, "localhost", 511, function () {
console.log("server starts");
})
Node中的http模块的更多相关文章
- Node中的net模块提供的前端通信
Node中的net模块提供的前端通信 客户端 业务: 客户端现在要在终端输入内容,然后回车发送内容给服务器 解决: Node中提供了一个叫做 readline 的 模块用于读取命令行内容 [ 单行读取 ...
- 关于node中两个模块相互引用却不会死循环的问题
关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...
- Node中require第三方模块的规则
Node.js中使用CommonJs模块化机制,通过npm下载的第三方包,我们在项目中引入第三方包都是:let xx = require('第三方包名'),究竟require方法加载第三方包的原理机制 ...
- node中npm安装模块的网络问题
最近使用node开发时,发现所有的依赖模块都安装不了啦,一直报错如下 rollbackFailedOptional: verb npm-session 5a4a66a1b8d06dc3 后来才发现是由 ...
- Node中使用mysql模块遇到的问题
Node的mysql模块,本人的感受就是不好用,各种报错,各种坑,有一个问题困扰了我很久,也不知道是不是我使用的方式不对,不过后来用easymysql模块解决了,我才深信这是一个坑. 问题描述: 假设 ...
- node中的url模块解析结果
1. URL模块作用: url 模块用于处理与解析 URL. 使用方法如下: const url = require('url'); 2. URL 字符串与 URL 对象 URL 字符串是结构化的字符 ...
- 说说对 Node 中的 fs 模块的理解? 有哪些常用方法?
一.是什么 fs(file system),该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装 可以说,所有与文件的操作都是通过fs核心模块实现 导入模块如下: const fs ...
- node中的cluster模块开启进程,进程共享数据
说明:共享数据 var collection = [41, 41, 41, 41] master.js console.log('###---start---###') var cluster = r ...
- 简单剖析Node中的事件监听机制(一)
使用js的class类简单的实现一个事件监听机制,不同于浏览器中的时间绑定与监听,类似于node中的时间监听,并且会在接下来的文章中去根据自己的理解去写一下Event模块中的原理. Node.js使用 ...
随机推荐
- OS实验一实验报告
实验一.命令解释程序的编写实验 专业:商业软件工程 姓名:王泽锴 学号:201406114113 一.实验目的 (1)掌握命令解释程序的原理: (2)*掌握简单的DOS调用方法: (3)掌握C语 ...
- 黑马程序员——JAVA基础之标准输入输出流
------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...
- jQuery 获取父窗口的元素 父窗口 子窗口(iframe)
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
- selenium加载时间过长
为了获取网站js渲染后的html,需要利用selenium加载网站,但是会出现加载时间过长的现象,因此可以限制其加载时间以及强制关掉加载: # !/usr/bin/python3.4 # -*- co ...
- JAVA单向/双向链表的实现
一.JAVA单向链表的操作(增加节点.查找节点.删除节点) class Link { // 链表类 class Node { // 保存每一个节点,此处为了方便直接定义成内部类 private Str ...
- Java 学习总结(一)
1. 概述 1.1 dos命令行--常见的命令 l dir : 列出当前目录下的文件以及文件夹 l md : 创建目录 l rd : 删除目录 l cd : 进入指 ...
- Lucene/Solr搜索引擎开发笔记 - 第1章 Solr安装与部署(Jetty篇)
一.为何开博客写<Lucene/Solr搜索引擎开发笔记> 本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/ ...
- 全景视频外包团队:技术分享Unity3D全景漫游
作者:未知 1.建模中使用的图片.文件.文件夹等以及模型中物体.材质等的名称都不能使用中文或者特殊符号,可以使用英文字母.数字.下划线等 2.调整Max的单位为米 3.烘培光影的设置 4.模型的中的植 ...
- razor 拼接字符串
在asp.net引擎中 拼接字符串可以这样写 <script src="~/script/<%=scriptname%>.js"></script&g ...
- 最小的K个数:用快排的思想去解相关问题
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边. 这个函数可以如下实现: int Partit ...