Rust URI解析与操作库re_uri的使用,高效处理Web链接和资源定位符

Rust URI解析与操作库re_uri的使用,高效处理Web链接和资源定位符

re_uri是rerun系列crate的一部分,用于解析和构建Rerun URI(如rerun://rerun+http://等)。

安装

在项目目录中运行以下Cargo命令:

cargo add re_uri

或在Cargo.toml中添加:

re_uri = "0.24.1"

使用示例

use re_uri::Uri;

fn main() {
    // 解析Rerun URI
    let uri = Uri::parse("rerun://path/to/resource?query=value").unwrap();
    
    // 获取URI各部分
    println!("Scheme: {}", uri.scheme()); // 输出: rerun
    println!("Path: {}", uri.path()); // 输出: /path/to/resource
    println!("Query: {:?}", uri.query()); // 输出: Some("query=value")
    
    // 构建URI
    let new_uri = Uri::builder()
        .scheme("rerun+http")
        .path("/new/path")
        .query("param=123")
        .build()
        .unwrap();
        
    println!("Constructed URI: {}", new_uri); // 输出: rerun+http://new/path?param=123
}

完整示例

use re_uri::{Uri, UriBuilder};

fn analyze_uri(uri_str: &str) {
    match Uri::parse(uri_str) {
        Ok(uri) => {
            println!("成功解析URI: {}", uri);
            println!("  方案: {}", uri.scheme());
            println!("  路径: {}", uri.path());
            
            if let Some(query) = uri.query() {
                println!("  查询参数: {}", query);
            }
            
            if let Some(fragment) = uri.fragment() {
                println!("  片段: {}", fragment);
            }
        }
        Err(e) => println!("解析URI失败: {}", e),
    }
}

fn main() {
    // 解析不同类型的URI
    analyze_uri("rerun://example.com/path?query=value#fragment");
    analyze_uri("rerun+http://localhost:8080/data");
    analyze_uri("invalid_uri");
    
    // 构建并修改URI
    let mut builder = UriBuilder::new();
    builder
        .scheme("rerun+https")
        .authority("api.example.com")
        .path("/v1/resource")
        .query("id=42&format=json");
        
    let custom_uri = builder.build().unwrap();
    println!("自定义URI: {}", custom_uri);
    
    // 修改现有URI
    let modified_uri = Uri::parse("rerun://old/path")
        .unwrap()
        .into_builder()
        .path("/new/path")
        .build()
        .unwrap();
    println!("修改后的URI: {}", modified_uri);
}

特性

  • 支持解析和构建Rerun特定的URI格式
  • 提供URI各部分的便捷访问方法
  • 类型安全且高效的URI操作
  • 支持常见的URI组件:方案、路径、查询参数等

许可证

re_uri采用MIT或Apache-2.0双许可证。


1 回复

Rust URI解析与操作库re_uri的使用

简介

re_uri是一个专注于URI/URL解析和操作的Rust库,提供高效且符合标准的Web链接和资源定位符处理能力。它支持RFC 3986定义的URI规范,能够解析、构建、修改和验证URI。

主要特性

  • 完整的URI解析和验证
  • URI组件分解和访问
  • URI构建和修改
  • 相对URI解析
  • 百分号编码(Percent-encoding)处理
  • 轻量级且无依赖

安装

在Cargo.toml中添加依赖:

[dependencies]
re_uri = "0.3"

基本使用示例

解析URI

use re_uri::Uri;

fn main() {
    // 解析URI字符串
    let uri_str = "https://example.com:8080/path/to/resource?query=value#fragment";
    let uri = Uri::parse(uri_str).expect("Invalid URI");
    
    // 输出各个组件
    println!("Scheme: {}", uri.scheme());
    println!("Authority: {}", uri.authority().unwrap());
    println!("Path: {}", uri.path());
    println!("Query: {:?}", uri.query());
    println!("Fragment: {:?}", uri.fragment());
}

构建URI

use re_uri::UriBuilder;

fn main() {
    // 使用构建器模式创建URI
    let uri = UriBuilder::new()
        .scheme("https")
        .authority("example.com:8080")
        .path("/api/v1/users")
        .query("page=2&limit=10")
        .fragment("results")
        .build()
        .unwrap();
    
    println!("Constructed URI: {}", uri);
}

修改URI

use re_uri::Uri;

fn main() {
    // 解析现有URI
    let mut uri = Uri::parse("https://example.com/path").unwrap();
    
    // 修改scheme部分
    uri.set_scheme("http").unwrap();
    
    // 添加查询参数
    uri.set_query(Some("param=value"));
    
    println!("Modified URI: {}", uri);
}

相对URI解析

use re_uri::{Uri, UriRef};

fn main() {
    // 基础URI
    let base = Uri::parse("https://example.com/base/").unwrap();
    // 相对路径
    let relative = UriRef::parse("../resource").unwrap();
    
    // 解析为绝对URI
    let resolved = relative.resolve(&base).unwrap();
    println!("Resolved URI: {}", resolved);  // 输出: https://example.com/resource
}

高级用法示例

处理查询参数

use re_uri::Uri;
use std::collections::HashMap;

// 将查询字符串解析为HashMap
fn parse_query(uri: &Uri) -> HashMap<String, String> {
    uri.query()
        .map(|q| {
            q.split('&')
                .filter_map(|pair| {
                    let mut kv = pair.splitn(2, '=');
                    match (kv.next(), kv.next()) {
                        (Some(k), Some(v)) => Some((k.to_string(), v.to_string())),
                        _ => None,
                    }
                })
                .collect()
        })
        .unwrap_or_default()
}

fn main() {
    let uri = Uri::parse("https://example.com?name=John&age=30").unwrap();
    let params = parse_query(&uri);
    
    println!("Query params: {:?}", params);
}

百分号编码处理

use re_uri::percent_encode;

fn main() {
    // 编码特殊字符
    let encoded = percent_encode("user@example.com");
    println!("Encoded: {}", encoded);  // 输出: user%40example.com
    
    // 解码
    let decoded = re_uri::percent_decode(encoded.as_bytes());
    println!("Decoded: {}", String::from_utf8(decoded).unwrap());
}

错误处理示例

use re_uri::Uri;

fn main() {
    // 处理可能失败的URI解析
    match Uri::parse("invalid uri") {
        Ok(uri) => println!("Valid URI: {}", uri),
        Err(e) => println!("Error parsing URI: {}", e),
    }
}

完整示例demo

下面是一个综合使用re_uri库的完整示例,展示了从创建、修改到解析URI的全过程:

use re_uri::{Uri, UriBuilder, UriRef};
use std::collections::HashMap;

fn main() {
    // 1. 构建一个新URI
    let api_uri = UriBuilder::new()
        .scheme("https")
        .authority("api.example.com")
        .path("/v1/data")
        .query("format=json&limit=100")
        .build()
        .unwrap();
    println!("API URI: {}", api_uri);

    // 2. 修改现有URI
    let mut modified_uri = api_uri.clone();
    modified_uri.set_query(Some("format=xml&offset=50"));
    println!("Modified URI: {}", modified_uri);

    // 3. 解析相对路径
    let base_uri = Uri::parse("https://example.com/docs/tutorial/").unwrap();
    let relative_ref = UriRef::parse("../reference").unwrap();
    let resolved_uri = relative_ref.resolve(&base_uri).unwrap();
    println!("Resolved URI: {}", resolved_uri);

    // 4. 处理查询参数
    let query_params = parse_query(&api_uri);
    println!("Query Parameters: {:?}", query_params);

    // 5. 编码/解码示例
    let raw_str = "data@test/value";
    let encoded = re_uri::percent_encode(raw_str);
    println!("Encoded: {}", encoded);
    let decoded = re_uri::percent_decode(encoded.as_bytes());
    println!("Decoded: {}", String::from_utf8(decoded).unwrap());
}

// 解析查询字符串到HashMap
fn parse_query(uri: &Uri) -> HashMap<String, String> {
    uri.query()
        .map(|q| {
            q.split('&')
                .filter_map(|pair| {
                    let mut kv = pair.splitn(2, '=');
                    match (kv.next(), kv.next()) {
                        (Some(k), Some(v)) => Some((k.to_string(), v.to_string())),
                        _ => None,
                    }
                })
                .collect()
        })
        .unwrap_or_default()
}

性能提示

re_uri在设计上注重性能:

  • 尽可能避免不必要的内存分配
  • 延迟计算某些组件直到首次访问
  • 提供零拷贝解析选项

对于需要处理大量URI的高性能场景,建议重用Uri实例而不是重复创建。

re_uri是处理URI相关操作的强大工具,特别适合Web开发、网络编程和资源定位等场景。

回到顶部