我一直在尝试实现一个restful服务器,它在HTTP get响应中从数据库返回一些JSONed数据。我正在使用rustful箱子。到目前为止,我能够检索数据,但我无法弄清楚如何在响应正文中返回它们。
#[macro_use]
extern crate rustful;
extern crate rustc_serialize;
extern crate postgres;
use std::error::Error;
use rustful::{Server, Context, Response, TreeRouter, Log, Handler};
use rustful::context::ExtJsonBody;
use postgres::{Connection, SslMode};
#[derive(RustcEncodable,RustcDecodable)]
struct Coord {
lat: f64,
long: f64,
expr: String
}
fn get(context: Context, response: Response) {
let conn = Connection::connect("postgresql://postgres:password@localhost", &SslMode::None).unwrap();
let stmt = conn.prepare("SELECT latitude,longitude,expiry FROM coord LIMIT 1").unwrap();
let result = stmt.query(&[]).unwrap();
for row in result {
let coord = Coord {
lat: row.get(0),
long: row.get(1),
expr: row.get(2)
};
println!("Latitude: {}\nLongitude: {}\nExpiry: {}", coord.lat, coord.long, coord.expr);
}
response.send(format!("{:?}", coord.lat))
}
struct HandlerFn(fn(Context, Response));
impl Handler for HandlerFn {
fn handle_request(&self, context: Context, response: Response) {
self.0(context, response);
}
}
fn main() {
let server = Server {
host: 8080.into(),
handlers: insert_routes! {
TreeRouter::new() => {
Get: HandlerFn(get)
}
},
..Server::default()
}.run();
match server {
Ok(_server) => {},
Err(e) => println!("Cannot start server: {}", e.description())
}
}
代码目前因此错误而失败:
src/main.rs:40:35: 40:40 error: unresolved name `coord`
src/main.rs:40 response.send(format!("{:?}", coord.lat))
^~~~~
note: in expansion of format_args!
<std macros>:2:26: 2:57 note: expansion site
<std macros>:1:1: 2:61 note: in expansion of format!
src/main.rs:40:19: 40:45 note: expansion site
error: aborting due to previous error
答案 0 :(得分:4)
变量有词法范围,也就是说,变量可用的地方与源代码中的花括号相关联。这是一个小例子:
fn main() {
{
let value = 42;
}
println!("{}", value);
}
value
在定义它的花括号之外无法访问。
您遇到同样的问题:
for row in result {
let coord = Coord {...};
}
response.send(format!("{:?}", coord.lat))
创建循环的每次迭代coord
,然后删除。没有任何东西与循环外的名称coord
相对应。
很难告诉你如何解决问题。 docs for Response::send
说(强调我的):
将数据发送到客户端并完成响应
这意味着您只能发送一个响应。您将不得不弄清楚如何组合所有结果,然后将它们一起发送回去。可能JSON阵列符合要求。