Rust App 链接生成实例
通过 Rust 生成酷炫链接的玩法多种多样,涵盖短链接生成、动态参数解析、自定义协议处理等。以下是 实例中的部分精选示例:
短链接服务
使用 reqwest
和 serde
调用第三方短链接 API(如 Bitly):
use reqwest::Client;
use serde_json::json;
async fn shorten_url(long_url: &str) -> Result<String, reqwest::Error> {
let client = Client::new();
let resp = client.post("https://api-ssl.bitly.com/v4/shorten")
.header("Authorization", "Bearer YOUR_ACCESS_TOKEN")
.json(&json!({ "long_url": long_url }))
.send()
.await?
.json::<serde_json::Value>()
.await?;
Ok(resp["link"].as_str().unwrap().to_string())
}
动态参数解析
利用 url
库解析链接中的查询参数:
use url::Url;
fn parse_query(url: &str) {
let parsed = Url::parse(url).unwrap();
for (k, v) in parsed.query_pairs() {
println!("Key: {}, Value: {}", k, v);
}
}
自定义协议处理
注册 myapp://
协议并处理深层链接(需配合平台特定代码):
#[cfg(target_os = "windows")]
fn register_protocol() {
use winreg::enums::*;
use winreg::RegKey;
let hkcr = RegKey::predef(HKEY_CLASSES_ROOT);
let (key, _) = hkcr.create_subkey("myapp").unwrap();
key.set_value("URL Protocol", &"").unwrap();
key.set_value("", &"URL:MyApp Protocol").unwrap();
let (shell, _) = key.create_subkey("shell\\open\\command").unwrap();
shell.set_value("", &format!("\"{}\\" \"%1\"", std::env::current_exe().unwrap().display())).unwrap();
}
哈希校验链接
生成带 HMAC 签名的安全链接:
use hmac::{Hmac, Mac};
use sha2::Sha256;
fn generate_signed_url(base_url: &str, secret: &[u8]) -> String {
let mut mac = Hmac::<Sha256>::new_from_slice(secret).unwrap();
mac.update(base_url.as_bytes());
let sig = hex::encode(mac.finalize().into_bytes());
format!("{}?sig={}", base_url, sig)
}
二维码生成
将链接转换为二维码(使用 qrcode
库):
use qrcode::QrCode;
use qrcode::render::unicode;
fn url_to_qrcode(url: &str) -> String {
let code = QrCode::new(url.as_bytes()).unwrap();
code.render::<unicode::Dense1x2>()
.dark_color(unicode::Dense1x2::Dark)
.light_color(unicode::Dense1x2::Light)
.build()
}
链接预览服务
生成带 OpenGraph 元信息的页面预览:
use scraper::{Html, Selector};
async fn fetch_og_tags(url: &str) -> Result<(), reqwest::Error> {
let html = reqwest::get(url).await?.text().await?;
let doc = Html::parse_document(&html);
let og_title = Selector::parse("meta[property=\"og:title\"]").unwrap();
for elem in doc.select(&og_title) {
println!("Title: {}", elem.value().attr("content").unwrap());
}
Ok(())
}
(注:以上为部分示例,完整 100 例可扩展更多场景如:统计跟踪、地理定位链接、时间敏感链接、A/B 测试链接等)
以下是30个基于Rust与Bitly API交互的实用示例,涵盖链接缩短、管理和分析等功能。示例中使用reqwest
库进行HTTP请求,并假设已添加bitly-api
或类似依赖到Cargo.toml
。
初始化Bitly客户端
use reqwest::Client;
use serde_json::json;
const BITLY_TOKEN: &str = "YOUR_ACCESS_TOKEN";
fn bitly_client() -> Client {
Client::builder()
.default_headers(std::iter::once((
"Authorization".parse().unwrap(),
format!("Bearer {}", BITLY_TOKEN).parse().unwrap(),
)).collect())
.build()
.unwrap()
}
缩短单个链接
async fn shorten_url(long_url: &str) -> Result<String, reqwest::Error> {
let response = bitly_client()
.post("https://api-ssl.bitly.com/v4/shorten")
.json(&json!({ "long_url": long_url }))
.send()
.await?
.json::<serde_json::Value>()
.await?;
Ok(response["link"].as_str().unwrap().to_string())
}
批量缩短链接
async fn batch_shorten_urls(urls: Vec<&str>) -> Vec<String> {
let client = bitly_client();
let mut results = Vec::new();
for url in urls {
if let Ok(short) = shorten_url(url).await {
results.push(short);
}
}
results
}
获取链接的点击次数
async fn get_clicks(bitlink_id: &str) -> Result<u64, reqwest::Error> {
let url = format!("https://api-ssl.bitly.com/v4/bitlinks/{}/clicks", bitlink_id);
let response = bitly_client()
.get(&url)
.send()
.await?
.json::<serde_json::Value>()
.await?;
Ok(response["total_clicks"