Node Web学习笔记(5)-URL解析,Get访问

通过HTTP协议访问服务器,有两种方法,那就是通常所说的Get/Post访问。这次主要内容是Node如何对URL进行解析?如何获取Get访问信息?

1、何为Get方法

首先要了解一下何为Get方法访问?这里简要介绍一下Get以及Post方法的区别和基本原理。这块不是这里的主要内容,我直接摘录了GET POST 区别详解_HTML,可以先了解一下。

Get是用来从服务器上获得数据。
Get将表单数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;

Post是用来向服务器上传递数据。
Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。

那么,要获取html的Get访问,首先就要解析URL,这里就这涉及了url模块以及querystring模块。下面通过代码来学习这两个模块的相关方法。

2、URL解析

Get的访问信息全都显示在URL上了,想要获取get访问的相关参数,就要学会解析URL。

1
2
3
4
5
6
7
8
9
var http = require('http');
var url = require('url');
var util = require('util');
var server = http.createServer(function(req,res){
res.writeHead(200 , {"Content-Type":"text/html"});
res.end("YOU require : " + util.inspect(url.parse(req.url))); //重点在这里
});
server.listen(8888);
console.log("Your server is started @port 8888");

其实这段代码最主要的就是两个函数。

  1. url.parse(req.url),输入 URL 字符串,返回一个对象。
  2. util.inspect(object),返回一个对象的字符串表现形式,。通常用于代码调试。

通过下面的网址访问:
http://localhost:8888/p/a/t/h?query=string#hash

得到的结果如下:
YOU require : { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: ‘?query=string’, query: ‘query=string’, pathname: ‘/p/a/t/h’, path: ‘/p/a/t/h?query=string’, href: ‘/p/a/t/h?query=string’ }

查看官方API,来看看这些字段都是什么含义?上面得到的结果有好多是null,原因我也不太清楚,求高手解答

  • href: 所解析的完整原始 URL。协议名和主机名都已转为小写。例如: http://localhost:8888/p/a/t/h?query=string#hash
  • protocol: 请求协议,小写。例如: http:
  • host: URL主机名已全部转换成小写, 包括端口信息。例如: localhost:8888
  • auth:URL中身份验证信息部分。例如: user:pass,这里没有。
  • hostname:主机的主机名部分, 已转换成小写。例如: host.com
  • port: 主机的端口号部分。例如: 8888
  • pathname: URL的路径部分,位于主机名之后请求查询之前。例如: /p/a/t/h
  • search: URL 的“查询字符串”部分,包括开头的问号。例如: ?query=string
  • path: pathname 和 search 连在一起。 例如: /p/a/t/h?query=string
  • query: 查询字符串中的参数部分(问号后面部分字符串),或者使用querystring.parse()解析后返回的对象。例如: query=string or {'query':'string'}
  • hash: URL 的 “#” 后面部分(包括 # 符号) 例如: #hash

3、querystring反序列化

好了,通过上面,咱们就找到了我们想要获取的信息,那就是query对象,它的内容是hello=Node&hello2=Node2,那么如何再把这个字符串解析成对象进行访问呢?这里就要用到querystring模块了。

1
2
3
4
var querystring = require('querystring');
var hello = querystring.parse('hello=Node&hello2=Node2').hello;
var hello2 = querystring.parse('hello=Node&hello2=Node2').hello2;
console.log("hello值为:" + hello + "; hello2值为:" + hello2);

很简单的一段代码,querystring的parse方法将一个 query string 反序列化为一个对象。然后直接通过key-value对应取值就OK了。

4、Get方法获取信息

那么完整的Get方法获取参数的代码就如下所示:(自己可以尝试写出来)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var http = require('http');
var url = require('url');
var querystring = require('querystring');
var util = require('util');
var server = http.createServer(function(req,res){
var pathname = url.parse(req.url).pathname;
var username = querystring.parse(url.parse(req.url).query).username;
var email = querystring.parse(url.parse(req.url).query).email;
console.log(pathname);
if(pathname == "/index"){
res.writeHead(200 , {"Content-Type":"text/html"});
res.write("Your username is : " + username + "</br>");
res.write("Your email is : " + email);
res.end();
}else{
res.writeHead(200 , {"Content-Type":"text/html"});
res.end("<h1>I can't find the page! Please visit /index...</h1>");
}
});
server.listen(8888);
console.log("Pleaes viste: http://localhost:8888/index?username=zhangsan&email=1@qq.com");

通过网址http://localhost:8888/index?username=zhangsan&email=1@qq.com访问服务器。可以看到返回了usernameemail信息。

其实在这里,我们可以通过url.parse()方法直接获取参数对象,而不用借助querystring模块,因为url.parse()方法有个参数的设置可以直接将query字段内容转换成对象。你可以参考Node.js API 中文版,然后自己尝试一下。