#服务 #微服务 #REST #同步 #运行时 #非完整 #ras

ras_service

构建(非完整)REST 微服务的简单库

1 个不稳定版本

0.2.0 2022 年 3 月 26 日
0.1.1 2022 年 3 月 20 日
0.1.0 2022 年 3 月 18 日

#112 in #微服务


ras_auth 中使用

MIT 许可证

21KB
505

ras-service

构建(非完整)REST 微服务的简单库

crates.io: https://crates.io/crates/ras_service docs.rs: https://docs.rs/ras_service/0.2.0/ras_service


lib.rs:

构建(非完整)REST 微服务的简单库

Is used async tokio runtime.

要构建运行时,使用方法 "get_runtime"。

要创建执行器,使用方法 "new",借用运行时和服务。

要添加功能,使用函数 "add_get_functions" 和 "add_post_functions"。

函数名是 URL 中的最后一个单词。

签名函数

fn(Handle, Arc, Option<&str>) -> RasResult

必须返回 RasResult::Sync 以进行同步调用,以及 RasResult::Async 以进行异步调用。

Sync 包含 HttpStatus 和答案数据。Async 包含将等待的 JoinHandle。

示例

use ras_service::*;

// Your Service (used for contains resources, as discriptos or data)
// Must be Sync + Send
struct Service {
	some_data: String,
}

//Build your constructor here
impl Service {
	async fn new() -> Service {
		Service {
			some_data: "resource".to_string(),
		}
	}
}

//Sync get function
fn some_test_get(
	runtime: Handle,
	self_service: Arc<Service>,
	params: Option<&str>)
-> RasResult {
	let result = if let Some(param_str) = params {
		format!(
			"Your params: {:#?}",
   			ras_service::ras_helper::parse_get_params(param_str)
		)
	} else {
		"Empty params".to_string()
	};
	RasResult::Sync(
		HttpStatus::OK,
		Some(result)
	)
}

//Async post funtion
fn some_test_post(
	runtime: Handle,
	self_service: Arc<Service>,
	query: Option<&str>)
-> RasResult {
	let query: HashMap<String, Option<String>> = 
		if let Some(query_str) = query {
			match serde_json::from_str(query_str) {
				Ok(query) => query,
				Err(err) => {
					eprintln!("Error! Bad json format: {:?}", err);
					return RasResult::Sync(HttpStatus::BadRequest, None);
				}
			}
		} else {
			return RasResult::Sync(HttpStatus::BadRequest, None);
		};
	let service = self_service.clone();
	RasResult::Async(runtime.spawn(async move {
		let result = format!("You data: {:?}; Resource: {:?}", query, service.some_data);
		(HttpStatus::OK, Some(result))
	}))
}

fn main() {
	let runtime = RasServiceBuilder::<Service>::get_runtime(4);
	let service = runtime.block_on(async {Service::new().await});
	RasServiceBuilder::new(runtime, service)
		.set_socket_url("127.0.0.1:7878")
		.add_get_function("some_test".to_string(), some_test_get)
		.add_post_function("some_test".to_string(), some_test_post)
		//.run();
		;
     	assert_eq!(1, 1);
}

依赖项

~8–23MB
~327K SLoC