2

ドキュメントで、Mutex によって保護され、すべてのルート ハンドラーで使用できる処理スレッド間で共有されるグローバル状態を作成する方法の例を見つけました。完全!ただし、関数にアタッチされた属性を使用して、ルート ハンドラーを接続することを好みます。属性付き関数を使用し、グローバル状態を渡すための構文 (許可されている場合) がわかりません。

https://docs.rs/actix-web/1.0.2/actix_web/web/struct.Data.htmlの actix-web ドキュメントの例を次に示します。

use std::sync::Mutex;
use actix_web::{web, App};

struct MyData {
    counter: usize,
}

/// Use `Data<T>` extractor to access data in handler.
fn index(data: web::Data<Mutex<MyData>>) {
    let mut data = data.lock().unwrap();
    data.counter += 1;
}

fn main() {
    let data = web::Data::new(Mutex::new(MyData{ counter: 0 }));

    let app = App::new()
        // Store `MyData` in application storage.
        .register_data(data.clone())
        .service(
            web::resource("/index.html").route(
                web::get().to(index)));
}

という名前のルート ハンドラがどのようindexに渡されるかに注意してくださいweb::Data

ここに私のコードのスニペットがあります。

use actix_web::{get, App, HttpResponse, HttpServer, Responder};
pub mod request;
pub mod routes;

const SERVICE_NAME : &str = "Shy Rules Engine";
const SERVICE_VERSION : &str  = "0.1";

#[get("/")]
fn index() -> impl Responder {
    HttpResponse::Ok().body(format!("{} version {}", SERVICE_NAME, SERVICE_VERSION))
}

mod expression_execute {

  #[post("/expression/execute")]
  fn route(req: web::Json<ExpressionExecuteRequest>) -> HttpResponse {

    // ... lots of code omitted ...

    if response.has_error() {
        HttpResponse::Ok().json(response)
    }
    else {
        HttpResponse::BadRequest().json(response)
    }
  }

}

pub fn shy_service(ip : &str, port : &str) {
    HttpServer::new(|| {
        App::new()
            .service(index)
            .service(expression_execute::route)
    })
    .bind(format!("{}:{}", ip, port))
    .unwrap()
    .run()
    .unwrap();
}

App::serviceメソッドを呼び出してルート ハンドラを接続する方法に注目してください。

また、ルート ハンドラーがグローバル状態を受け取っていないことにも注意してください (アプリにまだ追加していないため)。グローバル アプリ データの作成に使用したドキュメントと同様のパターンを使用した場合、そのグローバル状態をハンドラーに渡すことができるようregister_dataに、メソッド シグネチャ、属性、およびその他にどのような変更をget加えればよいでしょうか?post

またはget、およびpost属性を使用してグローバル状態にアクセスすることはできませんか?

4

1 に答える 1