// use actix_web::{error, web, App, Error, HttpResponse}; use bytes::BytesMut; use futures::StreamExt; use serde::{Deserialize, Serialize}; use serde_json; #[derive(Serialize, Deserialize)] struct MyObj { name: String, number: i32, } const MAX_SIZE: usize = 262_144; // max payload size is 256k async fn index_manual(mut payload: web::Payload) -> Result { // payload is a stream of Bytes objects let mut body = BytesMut::new(); while let Some(chunk) = payload.next().await { let chunk = chunk?; // limit max size of in-memory payload if (body.len() + chunk.len()) > MAX_SIZE { return Err(error::ErrorBadRequest("overflow")); } body.extend_from_slice(&chunk); } // body is loaded, now we can deserialize serde-json let obj = serde_json::from_slice::(&body)?; Ok(HttpResponse::Ok().json(obj)) // <- send response } // #[actix_rt::main] async fn main() -> std::io::Result<()> { use actix_web::HttpServer; HttpServer::new(|| App::new().route("/", web::post().to(index_manual))) .bind("127.0.0.1:8088")? .run() .await }