mirror of
https://github.com/fafhrd91/actix-web
synced 2025-08-31 08:57:00 +02:00
added Json response support
This commit is contained in:
36
src/route.rs
36
src/route.rs
@@ -2,6 +2,8 @@ use std::marker::PhantomData;
|
||||
|
||||
use actix::Actor;
|
||||
use futures::Future;
|
||||
use serde_json;
|
||||
use serde::Serialize;
|
||||
|
||||
use error::Error;
|
||||
use context::{HttpContext, IoContext};
|
||||
@@ -223,3 +225,37 @@ impl<S, R, F> RouteHandler<S> for AsyncHandler<S, R, F>
|
||||
Reply::async((self.f)(req))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct Json<T: Serialize> (pub T);
|
||||
|
||||
impl<T: Serialize> FromRequest for Json<T> {
|
||||
type Item = HttpResponse;
|
||||
type Error = Error;
|
||||
|
||||
fn from_request(self, _: HttpRequest) -> Result<HttpResponse, Error> {
|
||||
let body = serde_json::to_string(&self.0)?;
|
||||
|
||||
Ok(HttpResponse::Ok()
|
||||
.content_type("application/json")
|
||||
.body(body)?)
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use http::header;
|
||||
|
||||
#[derive(Serialize)]
|
||||
struct MyObj {
|
||||
name: &'static str,
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_json() {
|
||||
let json = Json(MyObj{name: "test"});
|
||||
let resp = json.from_request(HttpRequest::default()).unwrap();
|
||||
assert_eq!(resp.headers().get(header::CONTENT_TYPE).unwrap(), "application/json");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user