[main.rs]
#[actix_rt::main]
async fn main() -> std::io::Result<()> {
let channel = Channel::from_static("http://127.0.0.1:5051")
.connect()
.await.unwrap();
let token = AsciiMetadataValue::from_static("...");
let mut user_client = UserServiceClient::with_interceptor(channel, move |mut req: Request<()>| {
req.metadata_mut().insert("authorization", token);
Ok(req)
});
let shared_data = web::Data::new(State {
user_client: user_client,
});
let app = move || {
App::new()
.app_data(shared_data.clone()) ...
...
}
[user_handler.rs]
pub async fn get_users(path: web::Path<(i64,i64)>, state: web::Data<State>,) -> Result<HttpResponse, AppError> {
let request = tonic::Request::new(...);
let mut client = UserServiceClient::connect("http://127.0.0.1:5051").await?;
let mut grpc_response = client.list_users(request).await?.into_inner();
let json_response: UsersListResponse = grpc_response.into();
Ok(HttpResponse::Ok().json(json_response))
}
[state.rs]
pub struct State {
pub user_client: UserServiceClient<InterceptedService<Channel, fn(Request<()>) -> Result<Request<()>, Status>>>,
}
fn user_client_handler(mut req: Request<()>) -> Result<Request<()>, Status> {
req.metadata_mut().insert("authorization", token);
Ok(req)
}
let mut user_client = UserServiceClient::with_interceptor(channel,user_client_handler);
这是因为在你的定义中你使用了函数指针
fn(Request<()>) -> Result<Request<()>, Status>
注意小写的“fn”,如果你想使用闭包,你需要使用
impl Fn(Request<()>) -> Result<Request<()>, Status>