POST 使用 curl 向 Actix 服务器发出的请求因“400 错误请求”而失败
POST request using curl to Actix Server failing with "400 Bad Request"
我正在尝试使用 actix-web = "3.3.2"
构建一个 actix 服务器,以向 AWS SES 发送 POST 请求,AWS SES 将向路由正文中提供的地址发送电子邮件。我创建了一个名为 signup
的路由,其中 returns 具有以下 curl
请求的 400 响应:
curl -i POST -d "name=test_name&email=testemail@test.com" 127.0.0.1:8000/signup -v
.
我也试过为 -d
arg 发送一个 json
对象:
curl -i POST -d '{"name": "test_name", "email": "testemail@test.com"}' 127.0.0.1:8000/signup -v
双方回应:
curl: (6) Could not resolve host: POST
* Expire in 0 ms for 6 (transfer 0x5c7286c42fb0)
* Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5c7286c42fb0)
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#1)
> POST /signup HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Length: 42
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 42 out of 42 bytes
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< content-length: 0
content-length: 0
<
* Connection #1 to host 127.0.0.1 left intact
在我的 main.rs
文件中,我有以下内容在端口 8000 上创建 actix 服务器 运行。
#[actix_web::main]
async fn main() -> Result<(), StdErr> {
env_logger::init();
HttpServer::new(move || {
actix_web::App::new()
.wrap(Logger::default())
.service(signup)
})
.bind(("127.0.0.1", 8000))?
.run()
.await?;
Ok(())
}
我的服务 signup
位于 src/signup
,其中包含一个 mod.rs
,它公开了我的 routes.rs
文件中的 pub mod routes
,我在其中编写了以下:
#[post("/signup")]
pub async fn signup(body: actix_web::web::Json<SignupBody>) -> impl Responder {
let name = &body.name;
let email = &body.email;
let message = send_message(name.to_string(), email.to_string())
.await;
match message {
Ok(()) => {
web::Json(
SignupResp::Success(Success{ message: "Email Sent Successfully".into() })
)
}
Err(e) => {
web::Json(
SignupResp::ErrorResp(ErrorResp{ message: format!("{}", e) })
)
}
}
}
async fn send_message(name: String, email: String) -> Result<(), Box<dyn std::error::Error>> {
let ses_client = SesClient::new(rusoto_core::Region::UsEast1);
let from = "Test <test@test.com>";
let to = format!("{}, <{}>", name, email);
let subject = "Signup";
let body = "<h1>User Signup</h1>".to_string();
send_email_ses(&ses_client, from, &to, subject, body).await
}
async fn send_email_ses(
ses_client: &SesClient,
from: &str,
to: &str,
subject: &str,
body: String,
) -> Result<(), Box<dyn std::error::Error>> {
let email = Message::builder()
.from(from.parse()?)
.to(to.parse()?)
.subject(subject)
.body(body.to_string())?;
let raw_email = email.formatted();
let ses_request = SendRawEmailRequest {
raw_message: RawMessage {
data: base64::encode(raw_email).into(),
},
..Default::default()
};
ses_client.send_raw_email(ses_request).await?;
Ok(())
}
我是 actix 的新手,想知道是否有人可以验证我的 curl
请求是否格式错误,或者我的 actix 服务器是否有问题。任何帮助将不胜感激。
您的请求被拒绝,因为它没有指定内容类型。
为此,您必须添加 Content-Type
header。在 cURL 中,您可以这样做:
-H "Content-Type: application/json"
我正在尝试使用 actix-web = "3.3.2"
构建一个 actix 服务器,以向 AWS SES 发送 POST 请求,AWS SES 将向路由正文中提供的地址发送电子邮件。我创建了一个名为 signup
的路由,其中 returns 具有以下 curl
请求的 400 响应:
curl -i POST -d "name=test_name&email=testemail@test.com" 127.0.0.1:8000/signup -v
.
我也试过为 -d
arg 发送一个 json
对象:
curl -i POST -d '{"name": "test_name", "email": "testemail@test.com"}' 127.0.0.1:8000/signup -v
双方回应:
curl: (6) Could not resolve host: POST
* Expire in 0 ms for 6 (transfer 0x5c7286c42fb0)
* Trying 127.0.0.1...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x5c7286c42fb0)
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#1)
> POST /signup HTTP/1.1
> Host: 127.0.0.1:8000
> User-Agent: curl/7.64.0
> Accept: */*
> Content-Length: 42
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 42 out of 42 bytes
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< content-length: 0
content-length: 0
<
* Connection #1 to host 127.0.0.1 left intact
在我的 main.rs
文件中,我有以下内容在端口 8000 上创建 actix 服务器 运行。
#[actix_web::main]
async fn main() -> Result<(), StdErr> {
env_logger::init();
HttpServer::new(move || {
actix_web::App::new()
.wrap(Logger::default())
.service(signup)
})
.bind(("127.0.0.1", 8000))?
.run()
.await?;
Ok(())
}
我的服务 signup
位于 src/signup
,其中包含一个 mod.rs
,它公开了我的 routes.rs
文件中的 pub mod routes
,我在其中编写了以下:
#[post("/signup")]
pub async fn signup(body: actix_web::web::Json<SignupBody>) -> impl Responder {
let name = &body.name;
let email = &body.email;
let message = send_message(name.to_string(), email.to_string())
.await;
match message {
Ok(()) => {
web::Json(
SignupResp::Success(Success{ message: "Email Sent Successfully".into() })
)
}
Err(e) => {
web::Json(
SignupResp::ErrorResp(ErrorResp{ message: format!("{}", e) })
)
}
}
}
async fn send_message(name: String, email: String) -> Result<(), Box<dyn std::error::Error>> {
let ses_client = SesClient::new(rusoto_core::Region::UsEast1);
let from = "Test <test@test.com>";
let to = format!("{}, <{}>", name, email);
let subject = "Signup";
let body = "<h1>User Signup</h1>".to_string();
send_email_ses(&ses_client, from, &to, subject, body).await
}
async fn send_email_ses(
ses_client: &SesClient,
from: &str,
to: &str,
subject: &str,
body: String,
) -> Result<(), Box<dyn std::error::Error>> {
let email = Message::builder()
.from(from.parse()?)
.to(to.parse()?)
.subject(subject)
.body(body.to_string())?;
let raw_email = email.formatted();
let ses_request = SendRawEmailRequest {
raw_message: RawMessage {
data: base64::encode(raw_email).into(),
},
..Default::default()
};
ses_client.send_raw_email(ses_request).await?;
Ok(())
}
我是 actix 的新手,想知道是否有人可以验证我的 curl
请求是否格式错误,或者我的 actix 服务器是否有问题。任何帮助将不胜感激。
您的请求被拒绝,因为它没有指定内容类型。
为此,您必须添加 Content-Type
header。在 cURL 中,您可以这样做:
-H "Content-Type: application/json"