pub struct BarkClient { /* private fields */ }Expand description
同步 Bark 推送客户端
使用 reqwest 的 blocking 客户端实现,无需异步运行时,可以在任何环境下工作。 支持单个设备推送和批量推送功能。
§创建客户端
use bark_rs::SyncBarkClient;
// 创建没有默认设备密钥的客户端
let client = SyncBarkClient::new("https://api.day.app");
// 创建带有默认设备密钥的客户端
let client = SyncBarkClient::with_device_key("https://api.day.app", "your_device_key");§发送消息
use bark_rs::{SyncBarkClient, BarkMessage, Level};
let client = SyncBarkClient::with_device_key("https://api.day.app", "your_key");
// 方式 1: 使用 message() 方法的 Builder 模式
let response = client
.message()
.title("标题")
.body("内容")
.level(Level::Active)
.send()?;
// 方式 2: 先构建消息再发送
let message = BarkMessage::builder()
.title("标题")
.body("内容")
.build();
let response = client.send(&message)?;Implementations§
Source§impl SyncBarkClient
impl SyncBarkClient
Sourcepub fn new(base_url: &str) -> Self
pub fn new(base_url: &str) -> Self
创建新的同步 Bark 客户端
创建一个没有默认设备密钥的客户端实例。发送消息时需要在消息中指定设备密钥,
或者使用 SyncBarkClient::with_device_key 创建带默认密钥的客户端。
§参数
base_url- Bark 服务器的基础 URL(如https://api.day.app)
§示例
use bark_rs::SyncBarkClient;
let client = SyncBarkClient::new("https://api.day.app");Examples found in repository?
examples/batch_push.rs (line 5)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 创建同步客户端
5 let client = SyncBarkClient::new("https://api.day.app");
6
7 // 批量推送到多个设备
8 let response = client
9 .message()
10 .device_keys(vec![
11 "QJ48vPutCAsPW2B6pE2A3a".to_string(),
12 "device_key_2".to_string(),
13 "device_key_3".to_string(),
14 ])
15 .title("批量推送通知")
16 .body("这是一个发送给多个设备的批量消息")
17 .level(Level::TimeSensitive)
18 .volume(7)
19 .badge(1)
20 .group("批量通知")
21 .send()?;
22
23 println!(
24 "批量推送成功: code={}, message={}",
25 response.code, response.message
26 );
27
28 Ok(())
29}More examples
examples/error_handling.rs (line 7)
3fn main() {
4 println!("🚨 演示错误处理");
5
6 // 创建没有默认设备密钥的客户端
7 let client = SyncBarkClient::new("https://api.day.app");
8
9 // 尝试发送没有设备密钥的消息
10 let message_without_key = BarkMessage::builder()
11 .title("错误演示")
12 .body("这个消息没有设备密钥")
13 .build();
14
15 match client.send(&message_without_key) {
16 Ok(_) => println!("❌ 意外成功"),
17 Err(BarkError::MissingDeviceKey) => {
18 println!("✅ 正确捕获到缺少设备密钥错误");
19 }
20 Err(e) => println!("❓ 其他错误: {}", e),
21 }
22
23 // 演示正确的错误处理模式
24 let result = client
25 .message()
26 .device_key("QJ48vPutCAsPW2B6pE2A3a")
27 .title("正确的消息")
28 .body("这个消息有设备密钥")
29 .send();
30
31 match result {
32 Ok(response) => {
33 println!(
34 "✅ 消息发送成功: code={}, message={}",
35 response.code, response.message
36 );
37 }
38 Err(BarkError::RequestError(e)) => {
39 println!("❌ 网络请求错误: {}", e);
40 }
41 Err(BarkError::MissingDeviceKey) => {
42 println!("❌ 缺少设备密钥");
43 }
44 Err(BarkError::SerializationError(e)) => {
45 println!("❌ 序列化错误: {}", e);
46 }
47 Err(BarkError::InvalidUrl) => {
48 println!("❌ 无效URL");
49 }
50 }
51
52 println!("🎉 错误处理演示完成!");
53}examples/mixed_usage.rs (line 19)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🔀 演示混合使用场景");
8
9 // 创建一个消息,可以被不同的客户端使用
10 let shared_message = BarkMessage::builder()
11 .device_key("QJ48vPutCAsPW2B6pE2A3a")
12 .title("共享消息")
13 .body("这个消息可以被同步和异步客户端共用")
14 .level(Level::Active)
15 .sound("telegraph")
16 .build();
17
18 // 使用同步客户端发送
19 let sync_client = SyncBarkClient::new("https://api.day.app");
20 let sync_response = sync_client.send(&shared_message)?;
21 println!("✅ 同步发送成功: {}", sync_response.message);
22
23 // 如果启用了异步功能,演示异步发送
24 #[cfg(feature = "async")]
25 {
26 println!("🔄 也可以在异步环境中使用...");
27 let rt = tokio::runtime::Runtime::new()?;
28 rt.block_on(async {
29 let async_client = AsyncBarkClient::new("https://api.day.app");
30 match async_client.send(&shared_message).await {
31 Ok(response) => println!("✅ 异步发送成功: {}", response.message),
32 Err(e) => println!("❌ 异步发送失败: {}", e),
33 }
34 });
35 }
36
37 #[cfg(not(feature = "async"))]
38 {
39 println!("ℹ️ 如需异步功能,请启用 'async' feature");
40 }
41
42 // 演示消息复用
43 let another_client = SyncBarkClient::with_device_key("https://api.day.app", "default_key");
44
45 // 克隆消息并修改部分内容
46 let modified_message = BarkMessage::builder()
47 .title("修改后的消息")
48 .body("基于原消息修改的新消息")
49 .level(shared_message.level.clone().unwrap_or(Level::Active))
50 .sound(
51 &shared_message
52 .sound
53 .clone()
54 .unwrap_or_else(|| "default".to_string()),
55 )
56 .badge(5)
57 .build();
58
59 let response = another_client.send(&modified_message)?;
60 println!("✅ 修改消息发送成功: {}", response.message);
61
62 println!("🎉 混合使用演示完成!");
63
64 Ok(())
65}Sourcepub fn with_device_key(base_url: &str, device_key: &str) -> Self
pub fn with_device_key(base_url: &str, device_key: &str) -> Self
创建带有默认设备密钥的同步 Bark 客户端
创建一个具有默认设备密钥的客户端实例。如果消息中没有指定设备密钥, 将使用这里设置的默认密钥。消息中的密钥设置会覆盖默认密钥。
§参数
base_url- Bark 服务器的基础 URLdevice_key- 默认的设备密钥
§示例
use bark_rs::SyncBarkClient;
let client = SyncBarkClient::with_device_key(
"https://api.day.app",
"your_device_key"
);Examples found in repository?
examples/sync_client.rs (line 5)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 创建同步客户端(带默认设备密钥)
5 let client = SyncBarkClient::with_device_key("https://api.day.app", "QJ48vPutCAsPW2B6pE2A3a");
6
7 // 方式1: 使用客户端的链式调用
8 let response = client
9 .message()
10 .title("同步推送")
11 .body("这是同步客户端发送的消息")
12 .level(Level::Active)
13 .volume(7)
14 .send()?;
15
16 println!(
17 "同步推送成功: code={}, message={}",
18 response.code, response.message
19 );
20
21 // 方式2: 先构建消息,再发送
22 let message = BarkMessage::builder()
23 .title("独立构建的消息")
24 .body("消息构建与发送分离")
25 .level(Level::Critical)
26 .sound("alarm")
27 .badge(1)
28 .build();
29
30 let response = client.send(&message)?;
31 println!(
32 "独立消息发送成功: code={}, message={}",
33 response.code, response.message
34 );
35
36 Ok(())
37}More examples
examples/message_builder.rs (line 44)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 演示消息构建的各种方式
5 println!("🛠️ 演示消息构建功能");
6
7 // 方式1: 使用 BarkMessage::builder()
8 let message1 = BarkMessage::builder()
9 .title("Builder 模式")
10 .body("使用 BarkMessage::builder() 构建")
11 .level(Level::Active)
12 .sound("minuet")
13 .build();
14
15 // 方式2: 使用 BarkMessage::new()
16 let message2 = BarkMessage::new()
17 .title("New 方法")
18 .body("使用 BarkMessage::new() 构建")
19 .level(Level::TimeSensitive)
20 .volume(6)
21 .build();
22
23 // 方式3: 完整参数演示
24 let complete_message = BarkMessage::builder()
25 .title("完整参数演示")
26 .subtitle("副标题")
27 .body("这是一个包含所有参数的消息")
28 .level(Level::Critical)
29 .volume(8)
30 .badge(3)
31 .call(true)
32 .auto_copy(false)
33 .copy("自定义复制内容")
34 .sound("alarm")
35 .icon("https://example.com/icon.png")
36 .group("演示组")
37 .is_archive(true)
38 .url("https://example.com")
39 .action("none")
40 .id("demo_message_001")
41 .build();
42
43 // 创建同步客户端来发送这些消息
44 let client = SyncBarkClient::with_device_key("https://api.day.app", "QJ48vPutCAsPW2B6pE2A3a");
45
46 println!("📤 发送消息1...");
47 let response1 = client.send(&message1)?;
48 println!("✅ 消息1发送成功: {}", response1.message);
49
50 println!("📤 发送消息2...");
51 let response2 = client.send(&message2)?;
52 println!("✅ 消息2发送成功: {}", response2.message);
53
54 println!("📤 发送完整消息...");
55 let response3 = client.send(&complete_message)?;
56 println!("✅ 完整消息发送成功: {}", response3.message);
57
58 println!("🎉 所有消息发送完成!");
59
60 Ok(())
61}examples/mixed_usage.rs (line 43)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🔀 演示混合使用场景");
8
9 // 创建一个消息,可以被不同的客户端使用
10 let shared_message = BarkMessage::builder()
11 .device_key("QJ48vPutCAsPW2B6pE2A3a")
12 .title("共享消息")
13 .body("这个消息可以被同步和异步客户端共用")
14 .level(Level::Active)
15 .sound("telegraph")
16 .build();
17
18 // 使用同步客户端发送
19 let sync_client = SyncBarkClient::new("https://api.day.app");
20 let sync_response = sync_client.send(&shared_message)?;
21 println!("✅ 同步发送成功: {}", sync_response.message);
22
23 // 如果启用了异步功能,演示异步发送
24 #[cfg(feature = "async")]
25 {
26 println!("🔄 也可以在异步环境中使用...");
27 let rt = tokio::runtime::Runtime::new()?;
28 rt.block_on(async {
29 let async_client = AsyncBarkClient::new("https://api.day.app");
30 match async_client.send(&shared_message).await {
31 Ok(response) => println!("✅ 异步发送成功: {}", response.message),
32 Err(e) => println!("❌ 异步发送失败: {}", e),
33 }
34 });
35 }
36
37 #[cfg(not(feature = "async"))]
38 {
39 println!("ℹ️ 如需异步功能,请启用 'async' feature");
40 }
41
42 // 演示消息复用
43 let another_client = SyncBarkClient::with_device_key("https://api.day.app", "default_key");
44
45 // 克隆消息并修改部分内容
46 let modified_message = BarkMessage::builder()
47 .title("修改后的消息")
48 .body("基于原消息修改的新消息")
49 .level(shared_message.level.clone().unwrap_or(Level::Active))
50 .sound(
51 &shared_message
52 .sound
53 .clone()
54 .unwrap_or_else(|| "default".to_string()),
55 )
56 .badge(5)
57 .build();
58
59 let response = another_client.send(&modified_message)?;
60 println!("✅ 修改消息发送成功: {}", response.message);
61
62 println!("🎉 混合使用演示完成!");
63
64 Ok(())
65}Sourcepub fn message(&self) -> SyncBarkMessageBuilder<'_>
pub fn message(&self) -> SyncBarkMessageBuilder<'_>
创建消息构建器
返回一个与此客户端关联的消息构建器,支持链式调用来构建和发送消息。
§返回值
返回 SyncBarkMessageBuilder 实例
§示例
use bark_rs::{SyncBarkClient, Level};
let client = SyncBarkClient::with_device_key("https://api.day.app", "key");
let response = client
.message()
.title("标题")
.body("内容")
.level(Level::Active)
.send()?;Examples found in repository?
examples/batch_push.rs (line 9)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 创建同步客户端
5 let client = SyncBarkClient::new("https://api.day.app");
6
7 // 批量推送到多个设备
8 let response = client
9 .message()
10 .device_keys(vec![
11 "QJ48vPutCAsPW2B6pE2A3a".to_string(),
12 "device_key_2".to_string(),
13 "device_key_3".to_string(),
14 ])
15 .title("批量推送通知")
16 .body("这是一个发送给多个设备的批量消息")
17 .level(Level::TimeSensitive)
18 .volume(7)
19 .badge(1)
20 .group("批量通知")
21 .send()?;
22
23 println!(
24 "批量推送成功: code={}, message={}",
25 response.code, response.message
26 );
27
28 Ok(())
29}More examples
examples/sync_client.rs (line 9)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 创建同步客户端(带默认设备密钥)
5 let client = SyncBarkClient::with_device_key("https://api.day.app", "QJ48vPutCAsPW2B6pE2A3a");
6
7 // 方式1: 使用客户端的链式调用
8 let response = client
9 .message()
10 .title("同步推送")
11 .body("这是同步客户端发送的消息")
12 .level(Level::Active)
13 .volume(7)
14 .send()?;
15
16 println!(
17 "同步推送成功: code={}, message={}",
18 response.code, response.message
19 );
20
21 // 方式2: 先构建消息,再发送
22 let message = BarkMessage::builder()
23 .title("独立构建的消息")
24 .body("消息构建与发送分离")
25 .level(Level::Critical)
26 .sound("alarm")
27 .badge(1)
28 .build();
29
30 let response = client.send(&message)?;
31 println!(
32 "独立消息发送成功: code={}, message={}",
33 response.code, response.message
34 );
35
36 Ok(())
37}examples/error_handling.rs (line 25)
3fn main() {
4 println!("🚨 演示错误处理");
5
6 // 创建没有默认设备密钥的客户端
7 let client = SyncBarkClient::new("https://api.day.app");
8
9 // 尝试发送没有设备密钥的消息
10 let message_without_key = BarkMessage::builder()
11 .title("错误演示")
12 .body("这个消息没有设备密钥")
13 .build();
14
15 match client.send(&message_without_key) {
16 Ok(_) => println!("❌ 意外成功"),
17 Err(BarkError::MissingDeviceKey) => {
18 println!("✅ 正确捕获到缺少设备密钥错误");
19 }
20 Err(e) => println!("❓ 其他错误: {}", e),
21 }
22
23 // 演示正确的错误处理模式
24 let result = client
25 .message()
26 .device_key("QJ48vPutCAsPW2B6pE2A3a")
27 .title("正确的消息")
28 .body("这个消息有设备密钥")
29 .send();
30
31 match result {
32 Ok(response) => {
33 println!(
34 "✅ 消息发送成功: code={}, message={}",
35 response.code, response.message
36 );
37 }
38 Err(BarkError::RequestError(e)) => {
39 println!("❌ 网络请求错误: {}", e);
40 }
41 Err(BarkError::MissingDeviceKey) => {
42 println!("❌ 缺少设备密钥");
43 }
44 Err(BarkError::SerializationError(e)) => {
45 println!("❌ 序列化错误: {}", e);
46 }
47 Err(BarkError::InvalidUrl) => {
48 println!("❌ 无效URL");
49 }
50 }
51
52 println!("🎉 错误处理演示完成!");
53}Sourcepub fn send(&self, message: &BarkMessage) -> Result<BarkResponse>
pub fn send(&self, message: &BarkMessage) -> Result<BarkResponse>
发送 Bark 推送消息
根据消息是否包含多个设备密钥自动选择单个发送或批量发送。 如果消息和客户端都没有设备密钥,将返回错误。
§参数
message- 要发送的消息
§返回值
成功时返回 BarkResponse,失败时返回 BarkError
§错误
BarkError::MissingDeviceKey- 缺少设备密钥BarkError::RequestError- 网络请求错误BarkError::SerializationError- 序列化错误
§示例
use bark_rs::{SyncBarkClient, BarkMessage};
let client = SyncBarkClient::with_device_key("https://api.day.app", "key");
let message = BarkMessage::builder()
.body("测试消息")
.build();
let response = client.send(&message)?;
println!("发送成功: {}", response.message);Examples found in repository?
examples/sync_client.rs (line 30)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 创建同步客户端(带默认设备密钥)
5 let client = SyncBarkClient::with_device_key("https://api.day.app", "QJ48vPutCAsPW2B6pE2A3a");
6
7 // 方式1: 使用客户端的链式调用
8 let response = client
9 .message()
10 .title("同步推送")
11 .body("这是同步客户端发送的消息")
12 .level(Level::Active)
13 .volume(7)
14 .send()?;
15
16 println!(
17 "同步推送成功: code={}, message={}",
18 response.code, response.message
19 );
20
21 // 方式2: 先构建消息,再发送
22 let message = BarkMessage::builder()
23 .title("独立构建的消息")
24 .body("消息构建与发送分离")
25 .level(Level::Critical)
26 .sound("alarm")
27 .badge(1)
28 .build();
29
30 let response = client.send(&message)?;
31 println!(
32 "独立消息发送成功: code={}, message={}",
33 response.code, response.message
34 );
35
36 Ok(())
37}More examples
examples/error_handling.rs (line 15)
3fn main() {
4 println!("🚨 演示错误处理");
5
6 // 创建没有默认设备密钥的客户端
7 let client = SyncBarkClient::new("https://api.day.app");
8
9 // 尝试发送没有设备密钥的消息
10 let message_without_key = BarkMessage::builder()
11 .title("错误演示")
12 .body("这个消息没有设备密钥")
13 .build();
14
15 match client.send(&message_without_key) {
16 Ok(_) => println!("❌ 意外成功"),
17 Err(BarkError::MissingDeviceKey) => {
18 println!("✅ 正确捕获到缺少设备密钥错误");
19 }
20 Err(e) => println!("❓ 其他错误: {}", e),
21 }
22
23 // 演示正确的错误处理模式
24 let result = client
25 .message()
26 .device_key("QJ48vPutCAsPW2B6pE2A3a")
27 .title("正确的消息")
28 .body("这个消息有设备密钥")
29 .send();
30
31 match result {
32 Ok(response) => {
33 println!(
34 "✅ 消息发送成功: code={}, message={}",
35 response.code, response.message
36 );
37 }
38 Err(BarkError::RequestError(e)) => {
39 println!("❌ 网络请求错误: {}", e);
40 }
41 Err(BarkError::MissingDeviceKey) => {
42 println!("❌ 缺少设备密钥");
43 }
44 Err(BarkError::SerializationError(e)) => {
45 println!("❌ 序列化错误: {}", e);
46 }
47 Err(BarkError::InvalidUrl) => {
48 println!("❌ 无效URL");
49 }
50 }
51
52 println!("🎉 错误处理演示完成!");
53}examples/message_builder.rs (line 47)
3fn main() -> Result<(), Box<dyn std::error::Error>> {
4 // 演示消息构建的各种方式
5 println!("🛠️ 演示消息构建功能");
6
7 // 方式1: 使用 BarkMessage::builder()
8 let message1 = BarkMessage::builder()
9 .title("Builder 模式")
10 .body("使用 BarkMessage::builder() 构建")
11 .level(Level::Active)
12 .sound("minuet")
13 .build();
14
15 // 方式2: 使用 BarkMessage::new()
16 let message2 = BarkMessage::new()
17 .title("New 方法")
18 .body("使用 BarkMessage::new() 构建")
19 .level(Level::TimeSensitive)
20 .volume(6)
21 .build();
22
23 // 方式3: 完整参数演示
24 let complete_message = BarkMessage::builder()
25 .title("完整参数演示")
26 .subtitle("副标题")
27 .body("这是一个包含所有参数的消息")
28 .level(Level::Critical)
29 .volume(8)
30 .badge(3)
31 .call(true)
32 .auto_copy(false)
33 .copy("自定义复制内容")
34 .sound("alarm")
35 .icon("https://example.com/icon.png")
36 .group("演示组")
37 .is_archive(true)
38 .url("https://example.com")
39 .action("none")
40 .id("demo_message_001")
41 .build();
42
43 // 创建同步客户端来发送这些消息
44 let client = SyncBarkClient::with_device_key("https://api.day.app", "QJ48vPutCAsPW2B6pE2A3a");
45
46 println!("📤 发送消息1...");
47 let response1 = client.send(&message1)?;
48 println!("✅ 消息1发送成功: {}", response1.message);
49
50 println!("📤 发送消息2...");
51 let response2 = client.send(&message2)?;
52 println!("✅ 消息2发送成功: {}", response2.message);
53
54 println!("📤 发送完整消息...");
55 let response3 = client.send(&complete_message)?;
56 println!("✅ 完整消息发送成功: {}", response3.message);
57
58 println!("🎉 所有消息发送完成!");
59
60 Ok(())
61}examples/mixed_usage.rs (line 20)
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7 println!("🔀 演示混合使用场景");
8
9 // 创建一个消息,可以被不同的客户端使用
10 let shared_message = BarkMessage::builder()
11 .device_key("QJ48vPutCAsPW2B6pE2A3a")
12 .title("共享消息")
13 .body("这个消息可以被同步和异步客户端共用")
14 .level(Level::Active)
15 .sound("telegraph")
16 .build();
17
18 // 使用同步客户端发送
19 let sync_client = SyncBarkClient::new("https://api.day.app");
20 let sync_response = sync_client.send(&shared_message)?;
21 println!("✅ 同步发送成功: {}", sync_response.message);
22
23 // 如果启用了异步功能,演示异步发送
24 #[cfg(feature = "async")]
25 {
26 println!("🔄 也可以在异步环境中使用...");
27 let rt = tokio::runtime::Runtime::new()?;
28 rt.block_on(async {
29 let async_client = AsyncBarkClient::new("https://api.day.app");
30 match async_client.send(&shared_message).await {
31 Ok(response) => println!("✅ 异步发送成功: {}", response.message),
32 Err(e) => println!("❌ 异步发送失败: {}", e),
33 }
34 });
35 }
36
37 #[cfg(not(feature = "async"))]
38 {
39 println!("ℹ️ 如需异步功能,请启用 'async' feature");
40 }
41
42 // 演示消息复用
43 let another_client = SyncBarkClient::with_device_key("https://api.day.app", "default_key");
44
45 // 克隆消息并修改部分内容
46 let modified_message = BarkMessage::builder()
47 .title("修改后的消息")
48 .body("基于原消息修改的新消息")
49 .level(shared_message.level.clone().unwrap_or(Level::Active))
50 .sound(
51 &shared_message
52 .sound
53 .clone()
54 .unwrap_or_else(|| "default".to_string()),
55 )
56 .badge(5)
57 .build();
58
59 let response = another_client.send(&modified_message)?;
60 println!("✅ 修改消息发送成功: {}", response.message);
61
62 println!("🎉 混合使用演示完成!");
63
64 Ok(())
65}Auto Trait Implementations§
impl Freeze for SyncBarkClient
impl !RefUnwindSafe for SyncBarkClient
impl Send for SyncBarkClient
impl Sync for SyncBarkClient
impl Unpin for SyncBarkClient
impl UnsafeUnpin for SyncBarkClient
impl !UnwindSafe for SyncBarkClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more