영어 简体中文 繁體中文



Salvo는 매우 간단하고 강력한 Rust Web Backend 프레임 워크입니다. 백엔드 서비스를 개발하려면 기본적인 녹 지식 만 필요합니다.
여기에서 샘플을 보거나 공식 웹 사이트를 볼 수 있습니다.
ACME를 지원하는 서버를 구현하려면 몇 줄의 코드 만 필요하며 HTTP1, HTTP2 및 HTTP3 프로토콜을 지원합니다.
use salvo :: prelude :: * ;
# [ handler ]
async fn hello ( res : & mut Response ) {
res . render ( Text :: Plain ( "Hello World" ) ) ;
}
# [ tokio :: main ]
async fn main ( ) {
let mut router = Router :: new ( ) . get ( hello ) ;
let listener = TcpListener :: new ( "0.0.0.0:443" )
. acme ( )
. add_domain ( "test.salvo.rs" ) // Replace this domain name with your own.
. http01_challenge ( & mut router ) . quinn ( "0.0.0.0:443" ) ;
let acceptor = listener . join ( TcpListener :: new ( "0.0.0.0:80" ) ) . bind ( ) . await ;
Server :: new ( acceptor ) . serve ( router ) . await ;
}핸들러와 미들웨어 사이에는 차이가 없으며 미들웨어는 핸들러 일뿐입니다. 관련 유형 및 일반 유형과 같은 개념을 모르고 미들웨어를 쓸 수 있습니다. 함수를 작성할 수 있다면 미들웨어를 쓸 수 있습니다 !!!
use salvo :: http :: header :: { self , HeaderValue } ;
use salvo :: prelude :: * ;
# [ handler ]
async fn add_header ( res : & mut Response ) {
res . headers_mut ( )
. insert ( header :: SERVER , HeaderValue :: from_static ( "Salvo" ) ) ;
}그런 다음 라우터에 추가하십시오.
Router :: new ( ) . hoop ( add_header ) . get ( hello ) 이것은 매우 간단한 미들웨어이며 Response 에 Header 추가하고 전체 소스 코드를 봅니다.
일반적으로 우리는 다음과 같이 라우팅을합니다.
Router :: with_path ( "articles" ) . get ( list_articles ) . post ( create_article ) ;
Router :: with_path ( "articles/<id>" )
. get ( show_article )
. patch ( edit_article )
. delete ( delete_article ) ;종종 기사 및 기사 목록과 같은 것은 사용자 로그인이 필요하지 않지만 작성, 편집, 기사 삭제 등. 사용자 로그인 인증 권한이 필요합니다. Salvo의 나무와 같은 라우팅 시스템은이 요구를 충족시킬 수 있습니다. 사용자 로그인없이 라우터를 쓸 수 있습니다.
Router :: with_path ( "articles" )
. get ( list_articles )
. push ( Router :: with_path ( "<id>" ) . get ( show_article ) ) ;그런 다음 사용자가 함께 로그인 해야하는 라우터를 작성하고 해당 미들웨어를 사용하여 사용자가 로그인되어 있는지 확인하십시오.
Router :: with_path ( "articles" )
. hoop ( auth_check )
. push ( Router :: with_path ( "<id>" ) . patch ( edit_article ) . delete ( delete_article ) ) ; 이 두 경로는 동일한 path("articles") 를 가지고 있지만 동시에 동일한 상위 경로에 여전히 추가 할 수 있으므로 최종 경로는 다음과 같습니다.
Router :: new ( )
. push (
Router :: with_path ( "articles" )
. get ( list_articles )
. push ( Router :: with_path ( "<id>" ) . get ( show_article ) ) ,
)
. push (
Router :: with_path ( "articles" )
. hoop ( auth_check )
. push ( Router :: with_path ( "<id>" ) . patch ( edit_article ) . delete ( delete_article ) ) ,
) ; <id> 경로의 조각과 일치합니다. 정상적인 상황에서 기사 id 숫자 일 뿐이며, 정규식을 사용하여 id 매칭 규칙을 제한 할 수 있습니다. r"<id:/d+/>" .
나머지 모든 경로 조각과 일치하기 위해 <**> , <*+> 또는 <*?> 사용할 수도 있습니다. 코드를보다 읽기 쉽게 만들려면 경로 시맨틱을보다 명확하게하기 위해 적절한 이름을 추가 할 수도 있습니다. <**file_path> .
일치하는 경로에 대한 일부 정규 표현식은 자주 사용해야하며 Guid :과 같이 미리 등록 할 수 있습니다.
PathFilter :: register_wisp_regex (
"guid" ,
Regex :: new ( "[0-9a-fA-F]{8}-([0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}" ) . unwrap ( ) ,
) ;경로 일치가 필요할 때 더 간결하게 만듭니다.
Router :: with_path ( "<id:guid>" ) . get ( index )전체 소스 코드를 봅니다
Request 시 함수 file 별로 파일 Async를 얻을 수 있습니다.
# [ handler ]
async fn upload ( req : & mut Request , res : & mut Response ) {
let file = req . file ( "file" ) . await ;
if let Some ( file ) = file {
let dest = format ! ( "temp/{}" , file . name ( ) . unwrap_or_else ( || "file" . into ( ) ) ) ;
if let Err ( e ) = tokio :: fs :: copy ( & file . path , Path :: new ( & dest ) ) . await {
res . status_code ( StatusCode :: INTERNAL_SERVER_ERROR ) ;
} else {
res . render ( "Ok" ) ;
}
} else {
res . status_code ( StatusCode :: BAD_REQUEST ) ;
}
}여러 다른 데이터 소스에서 데이터를 쉽게 가져 와서 원하는 유형으로 조립할 수 있습니다. 예를 들어 사용자 정의 유형을 먼저 정의 할 수 있습니다.
# [ derive ( Serialize , Deserialize , Extractible , Debug ) ]
/// Get the data field value from the body by default.
# [ salvo ( extract ( default_source ( from = "body" ) ) ) ]
struct GoodMan < ' a > {
/// The id number is obtained from the request path parameter, and the data is automatically parsed as i64 type.
# [ salvo ( extract ( source ( from = "param" ) ) ) ]
id : i64 ,
/// Reference types can be used to avoid memory copying.
username : & ' a str ,
first_name : String ,
last_name : String ,
} 그런 다음 Handler 에서 다음과 같은 데이터를 얻을 수 있습니다.
# [ handler ]
async fn edit ( req : & mut Request ) {
let good_man : GoodMan < ' _ > = req . extract ( ) . await . unwrap ( ) ;
}다음과 같은 유형을 매개 변수로 기능으로 직접 전달할 수도 있습니다.
# [ handler ]
async fn edit < ' a > ( good_man : GoodMan < ' a > ) {
res . render ( Json ( good_man ) ) ;
}전체 소스 코드를 봅니다
프로젝트를 크게 변경하지 않고 OpenApi에 대한 완벽한 지원을 얻을 수 있습니다.
# [ derive ( Serialize , Deserialize , ToSchema , Debug ) ]
struct MyObject < T : ToSchema + std :: fmt :: Debug > {
value : T ,
}
# [ endpoint ]
async fn use_string ( body : JsonBody < MyObject < String > > ) -> String {
format ! ( "{:?}" , body )
}
# [ endpoint ]
async fn use_i32 ( body : JsonBody < MyObject < i32 > > ) -> String {
format ! ( "{:?}" , body )
}
# [ endpoint ]
async fn use_u64 ( body : JsonBody < MyObject < u64 > > ) -> String {
format ! ( "{:?}" , body )
}
# [ tokio :: main ]
async fn main ( ) {
tracing_subscriber :: fmt ( ) . init ( ) ;
let router = Router :: new ( )
. push ( Router :: with_path ( "i32" ) . post ( use_i32 ) )
. push ( Router :: with_path ( "u64" ) . post ( use_u64 ) )
. push ( Router :: with_path ( "string" ) . post ( use_string ) ) ;
let doc = OpenApi :: new ( "test api" , "0.0.1" ) . merge_router ( & router ) ;
let router = router
. push ( doc . into_router ( "/api-doc/openapi.json" ) )
. push ( SwaggerUi :: new ( "/api-doc/openapi.json" ) . into_router ( "swagger-ui" ) ) ;
let acceptor = TcpListener :: new ( "127.0.0.1:5800" ) . bind ( ) . await ;
Server :: new ( acceptor ) . serve ( router ) . await ;
}Salvo CLI는 새로운 Salvo 프로젝트의 생성을 단순화하고 웹 API, 웹 사이트, 데이터베이스 (SQLITE, PostgreSQL 포함 및 SQLX, Seaorm, Diesel, RBATIS)를 통한 MySQL을 지원하는 새로운 Salvo 프로젝트 작성을 단순화하는 명령 줄 도구입니다. Salvo-Cli를 사용하여 새로운 Salvo 프로젝트를 만들 수 있습니다.
cargo install salvo-clisalvo new project_name예제 폴더에서 더 많은 예제를 찾을 수 있습니다. 다음 명령 으로이 예제를 실행할 수 있습니다.
cd examples
cargo run --bin example-basic-auth 여기에서 basic-auth 대신 실행하려는 예제 이름을 사용할 수 있습니다.
벤치 마크 테스트 결과는 여기에서 찾을 수 있습니다.
https://web-frameworks-benchmark.netlify.app/result?l=rust
https://www.techempower.com/benchmarks/#section=data-r22
Salvo는 오픈 소스 프로젝트입니다. Salvo를 지원하려면 여기에서 커피를 살 수 있습니다.
Salvo는 그 중 하나에 따라 라이센스가 부여됩니다
Apache 라이센스, 버전 2.0, (라이센스--아파치 또는 http://www.apache.org/licenses/license-2.0).
MIT 라이센스 (라이센스 -MIT 또는 http://opensource.org/licenses/mit).