Node.js url 模块

Java FileNode.js 内置模块


Node.js 中的 url 模块是一个内置模块,用于处理和解析 URL(统一资源定位符)。它提供了一系列实用方法,可以轻松地解析、格式化和处理 URL 字符串。

URL(Uniform Resource Locator)是互联网上用来标识和定位资源的地址,例如:

https://www.example.com:8080/path/to/resource?query=string#hash

核心方法

url.parse() 方法

url.parse() 方法用于将一个 URL 字符串解析为一个 URL 对象。

实例

const url = require('url');

const urlString = 'https://www.example.com:8080/path/to/resource?query=string#hash';
const parsedUrl = url.parse(urlString);

console.log(parsedUrl);

输出结果将包含以下属性:

  • protocol: 协议(如 'https:')
  • host: 主机名和端口(如 'www.example.com:8080')
  • hostname: 主机名(如 'www.example.com')
  • port: 端口号(如 '8080')
  • pathname: 路径部分(如 '/path/to/resource')
  • query: 查询字符串(如 'query=string')
  • hash: 片段标识符(如 '#hash')

url.format() 方法

url.format() 方法与 parse() 相反,它将 URL 对象转换为字符串形式。

实例

const url = require('url');

const urlObject = {
  protocol: 'https:',
  host: 'www.example.com:8080',
  pathname: '/path/to/resource',
  query: { query: 'string' },
  hash: '#hash'
};

const formattedUrl = url.format(urlObject);
console.log(formattedUrl);
// 输出: https://www.example.com:8080/path/to/resource?query=string#hash

url.resolve() 方法

url.resolve() 方法用于解析相对于基础 URL 的目标 URL。

实例

const url = require('url');

const baseUrl = 'https://www.example.com/path/';
const relativeUrl = 'to/resource';

const resolvedUrl = url.resolve(baseUrl, relativeUrl);
console.log(resolvedUrl);
// 输出: https://www.example.com/path/to/resource

URL 对象的结构

一个完整的 URL 对象通常包含以下属性:

  1. 协议 (protocol) - 如 'http:' 或 'https:'
  2. 认证信息 (auth) - 包含用户名和密码
  3. 主机 (host) - 主机名和端口号
  4. 主机名 (hostname) - 仅主机名
  5. 端口 (port) - 端口号
  6. 路径 (pathname) - 资源路径
  7. 查询字符串 (search) - 以 '?' 开头的查询字符串
  8. 查询参数 (query) - 查询字符串的解析结果
  9. 片段标识符 (hash) - 以 '#' 开头的片段标识符

新版 URL API

Node.js 还提供了基于 WHATWG URL 标准的新版 API:

URL 类

实例

const { URL } = require('url');

const myUrl = new URL('https://www.example.com:8080/path/to/resource?query=string#hash');

console.log(myUrl.protocol); // 'https:'
console.log(myUrl.hostname); // 'www.example.com'
console.log(myUrl.port);     // '8080'
console.log(myUrl.pathname); // '/path/to/resource'
console.log(myUrl.search);   // '?query=string'
console.log(myUrl.hash);     // '#hash'

URLSearchParams 类

URLSearchParams 提供了处理查询字符串的便捷方法:

实例

const { URL, URLSearchParams } = require('url');

const myUrl = new URL('https://example.com/?name=John&age=30');
const params = new URLSearchParams(myUrl.search);

// 获取参数
console.log(params.get('name')); // 'John'
console.log(params.get('age'));  // '30'

// 添加参数
params.append('city', 'New York');

// 删除参数
params.delete('age');

// 转换为字符串
console.log(params.toString()); // 'name=John&city=New+York'

实际应用场景

1. 解析请求 URL

在 HTTP 服务器中解析客户端请求的 URL:

实例

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
 
  console.log('Path:', parsedUrl.pathname);
  console.log('Query:', parsedUrl.query);
 
  res.end('URL parsed successfully');
});

server.listen(3000);

2. 构建 API 端点

使用 URL 模块构建 RESTful API 端点:

实例

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
  const path = parsedUrl.pathname;
 
  if (path === '/api/users') {
    // 处理用户相关请求
    res.end(JSON.stringify({ users: ['John', 'Jane'] }));
  } else if (path === '/api/products') {
    // 处理产品相关请求
    res.end(JSON.stringify({ products: ['Phone', 'Laptop'] }));
  } else {
    res.statusCode = 404;
    res.end('Not Found');
  }
});

server.listen(3000);

3. 处理查询参数

实例

const http = require('http');
const url = require('url');

const server = http.createServer((req, res) => {
  const parsedUrl = url.parse(req.url, true);
  const query = parsedUrl.query;
 
  if (parsedUrl.pathname === '/search') {
    const keyword = query.q || '';
    const page = parseInt(query.page) || 1;
   
    res.end(`Searching for "${keyword}" on page ${page}`);
  }
});

server.listen(3000);

最佳实践

  1. 始终验证 URL - 在处理用户提供的 URL 时,始终验证其有效性
  2. 使用新版 API - 优先使用 WHATWG URL API,它更符合现代标准
  3. 处理异常 - 使用 try-catch 处理 URL 解析可能出现的错误
  4. 编码特殊字符 - 使用 encodeURIComponent() 对查询参数中的特殊字符进行编码
  5. 安全性考虑 - 当处理重定向时,验证目标 URL 以防止开放重定向漏洞

实例

// 安全示例:验证重定向 URL
function isValidRedirect(url) {
  const allowedDomains = ['example.com', 'trusted-site.com'];
  const parsedUrl = new URL(url);
  return allowedDomains.includes(parsedUrl.hostname);
}

通过掌握 Node.js 的 url 模块,你可以轻松处理各种 URL 相关操作,构建更加健壮和安全的网络应用。

Java FileNode.js 内置模块