通过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");
})