-3

I'm trying to return a JSON file using a Nickel template. I found some API sample code that returns a JSON response and modified it:

extern crate rustc_serialize;
#[macro_use]
extern crate nickel;

use nickel::{Nickel, HttpRouter, JsonBody};
use nickel::mimes::MediaType;
use nickel::status::*;
use rustc_serialize::json;
use std::collections::HashMap;

#[derive(RustcDecodable, RustcEncodable)]
struct Person {
    firstname: String,
    lastname: String,
}

fn main() {
    let mut server = Nickel::new();

    server.get("/post", middleware! { |request, mut response|

        let person: Person = Person { firstname: "firstName ".to_string(), lastname: "lastName".to_string()};

        let mut p: Vec<Person> = vec![];

        p.push(person);

        let json_data = json::encode(&p).unwrap();
        let mut data_result = "{\"status\": 200, \"data\":".to_owned();
        data_result.push_str(&json_data.to_string());

        data_result.push_str("}");

        response.set(StatusCode::Ok);
        response.set(MediaType::Json);
        format!("{}", data_result)
    });

    server.get("/json", middleware! { |_, response|
        let mut data = HashMap::new();
        data.insert("name", "user");
        return response.render("app/views/temp.tpl", &data);
        // template source 
        //
        //{name: {{name}}}
        //
    });

    server.listen("127.0.0.1:6767");
}

And /post returns this JSON:

{ "status": 200, "data": [{ "firstname": "firstName ", "lastname": "lastName" ]}

/json returns this text:

"name: user"

How to return a JSON file using templates?

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366
kai
  • 492
  • 3
  • 18

1 Answers1

0

It actually returns

{name: user}

All you need to do is add response.set(MediaType::Json); like you already have in the other handler:

#[macro_use]
extern crate nickel;

use nickel::{Nickel, HttpRouter};
use nickel::mimes::MediaType;
use std::collections::HashMap;

fn main() {
    let mut server = Nickel::new();

    server.get("/json", middleware! { |_, mut response| {
        let mut data = HashMap::new();
        data.insert("name", "user");
        response.set(MediaType::Json);
        return response.render("app/views/temp.tpl", &data);
    }});

    server.listen("127.0.0.1:6767");
}

Now, this may not be a good idea. Creating structured formats (CSV, JSON, XML, etc.) via string concatenation often has problems with malformed documents or improperly escaped data.

Shepmaster
  • 388,571
  • 95
  • 1,107
  • 1,366