Node02 - GET、POST数据解析
1、GET数据解析方法
(01)、手动剪切 => 实例1
const http=require('http');
http.createServer(function(req, res){
var GET={};
if (req.url.indexOf('?')!=-1){
var arr=req.url.split('?');
//arr[0] => 地址 /abc
//arr[1] => 数据 user=bule&pass=1234
var arr2=arr[1].split('&');
for(var i=0; i<arr2.length; i++){
var arr3 = arr2[i].split('=');
//arr3[0] => 用户名 blue
//arr3[1] => password 1234
GET[arr3[0]]=arr3[i];
}
}else{
var url=req.url;
}
// console.log(GET);
res.write(GET.toString());
res.end();
}).listen(8080);
(02)、利用 querystring(查询字符串) 解析 (该方法会把一个 URL 查询字符串 str
解析成一个键值对的集合。)
querystring.parse(str[, sep[, eq[, options]]]
str (string) 需要解析的 URL 查询的字符串
sep (string) 用于界定查询字符串中的键值对的子字符串。默认为 ‘ & ’
eq (string) 用于界定查询字符串中的键与值得子字符串。默认为 ‘ = ’
options <Object>
decodeURIComponent <Function> 解码查询字符串的字符时使用的函数。默认为 querystring.unescape()。
maxKeys <number> 指定要解析的键的最大数量。默认为 1000。指定为 0 则不限制。
例如:quertstr = querystring.parse('name=bule&pass=1234&age=18');
控制台输出内容:{ name: 'bule', pass: '1234', age: '18' }
*注释:querystring.parse 方法依然不是很特别方便,还有第三种方法。
(03)、利用 url 解析
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
urlString <string> 要解析的 URL 字符串。
parseQueryString <boolean> 如果为 true,则 query 属性总会通过 querystring 模块的 parse() 方法生成一个对象。 如果为 false,则返回的 URL 对象上的 query 属性会是一个未解析、未解码的字符串。 默认为 false。
slashesDenoteHost <boolean> 如果为 true,则 // 之后至下一个 / 之前的字符串会被解析作为 host。 例如,//foo/bar 会被解析为 {host: 'foo', pathname: '/bar'} 而不是 {pathname: '//foo/bar'}。 默认为 false。
url.parse() 方法会解析一个 URL 字符串并返回一个 URL 对象。
如果urlString不是字符串将会抛出TypeError。
如果auth属性存在但无法编码则抛出URIError。
例如:urlLib.parse('https://www.baidu.com/index?name=bule&pass=1234&age=18',true);
返回数据格式 =>
Url {
protocol: 'https:', //获取及设置URL的协议(protocol)部分。
slashes: true,
auth: null,
host: 'www.baidu.com', //获取及设置URL的主机(host)部分,
//*注=如果给host属性设置的值是无效值,那么该值将被忽略。
port: null,
hostname: 'www.baidu.com',
hash: null,
search: '?name=bule&pass=1234&age=18', //获取及设置URL的序列化查询(query)部分部分。
query: 'name=bule&pass=1234&age=18', //query 属性是不含开头 ASCII 问号(?)的查询字符串,或一个被
//querystring 模块的 parse() 方法返回的对象。 query 属性是一个字符
//串还是一个对象是由传入 url.parse() 的 parseQueryString 参数决定的。
//例如:'query=string' or {'query': 'string'}
pathname: '/index', //地址
path: '/index?name=bule&pass=1234&age=18',
href: 'https://www.baidu.com/index?name=bule&pass=1234&age=18'
}
*注释:urlLib.parse(".....", true);加 true => query格式改变为obj格式
query: { name: 'bule', pass: '1234', age: '18' },
2、POST数据接收:POST数据比GET打得多
(01)、 POST数据很大,所以需要分段接收
实例:
//POST--req
var str = '';//接收数据
req.on("data",function(data){ //正在接收数据
//每次迭代数据,数据有可能很大,会分很多段迭代
str+=data;
});
req.on('end',function(){ //数据接收完成
//通过解析querystring解析
var POST = queryString.parse(str);
console.log(POST);
//输出格式=> { user: 'bule', pass: '1234' }
});