gpt4 book ai didi

rust - 使用 actix-web 调用异步 reqwest

转载 作者:行者123 更新时间:2023-11-29 08:31:07 24 4
gpt4 key购买 nike

在我的 actix-web 服务器中,我尝试使用 reqwest 调用外部服务器,然后将响应返回给用户。

use actix_web::{web, App, HttpResponse, HttpServer, Responder};
use serde::{Deserialize, Serialize};
use futures::Future;
use lazy_static::lazy_static;
use reqwest::r#async::Client as HttpClient;
#[macro_use] extern crate serde_json;

#[derive(Debug, Deserialize)]
struct FormData {
title: String,
}

#[derive(Debug, Serialize, Deserialize)]
struct Response {
title: String,
}

fn main() {
HttpServer::new(|| {
App::new()
.route("/validate", web::post().to(validator))
})
.bind("127.0.0.1:8000")
.expect("Can not bind to port 8000")
.run()
.unwrap();
}

fn validator(form: web::Form<FormData>) -> impl Responder {
let _resp = validate(form.title.clone());
HttpResponse::Ok()
}

pub fn validate(title: String) -> impl Future<Item=String, Error=String> {
let url = "https://jsonplaceholder.typicode.com/posts";
lazy_static! {
static ref HTTP_CLIENT: HttpClient = HttpClient::new();
}
HTTP_CLIENT.post(url)
.json(
&json!({
"title": title,
})
)
.send()
.and_then(|mut resp| resp.json())
.map(|json: Response| {
println!("{:?}", json);
json.title
})
.map_err(|error| format!("Error: {:?}", error))
}

这有两个问题:

  1. println!("{:?}", json); 似乎从未运行过,或者至少我从未看到任何输出。
  2. 我得到 _resp 返回,这是一个 Future,我不明白如何等待它解决,以便我可以将字符串传回响应者

供引用:

$ curl -data "title=x" "https://jsonplaceholder.typicode.com/posts"
{
"title": "x",
"id": 101
}

最佳答案

要使 future 阻塞直到它被解决,你必须对其调用 wait,但这并不理想。

您可以让您的验证器函数返回一个 future 并在路由中调用 to_async 而不是 to。 future 解决后,框架将轮询并发送响应。

您还应该考虑使用 actix web 附带的 http 客户端,并减少对应用程序的依赖。

fn main() {
HttpServer::new(|| {
App::new()
.route("/validate", web::post().to_async(validator))
})
.bind("127.0.0.1:8000")
.expect("Can not bind to port 8000")
.run()
.unwrap();
}

fn validator(form: web::Form<FormData>) -> impl Future<Item=String, Error=String> {
let url = "https://jsonplaceholder.typicode.com/posts";
lazy_static! {
static ref HTTP_CLIENT: HttpClient = HttpClient::new();
}
HTTP_CLIENT.post(url)
.json(
&json!({
"title": form.title.clone(),
})
)
.send()
.and_then(|mut resp| resp.json())
.map(|json: Response| {
println!("{:?}", json);
HttpResponse::Ok().body(Body::from(json.title))
})
.map_err(|error| format!("Error: {:?}", error))
}

关于rust - 使用 actix-web 调用异步 reqwest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57645819/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com