2012-12-12 66 views
1

我想服务一个html页面以及一些json到客户端,没有可以在客户端处理的往返旅程。这可能吗?这样做的最好方法是什么?我曾考虑将它发送到标题中,但它似乎被一些人所诟病。任何例子都非常感谢。伪代码:网络服务器发送数据连同文件

main(){ 
    ... 
    app.addRequestHandler((req) => req.path == '/user', handler); 
} 

void handler(req, res) { 
    var file = new File(myHtmlFile); 
    res.headers.set(...); //add json here? 
    res.outputstream... //or here? 
    ... 
    stream.pipe(res.outputStream); 
} 

回答

2

在HTML文件中,你可以把一个标签要发送的响应之前更换。

例如,在你的HTML文件:

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
</head> 
<body> 
    <input type='hidden' id='datas' value="___JSON_DATAS___"/> 
    ... 
</body> 
</html> 

___JSON_DATAS___会在你的服务器的东西,如更换:

void handler(req, res) { 
    var file = new File(myHtmlFile); 
    readStreamAsString(file.openInputStream()).then((fileContent) { 
    final content = fileContent 
     .replaceAll("___JSON_DATAS___", htmlEscape(jsonAsString)); 
    res.outputStream.writeAsString(content); 
    res.outputStream.close(); 
    }); 
} 

String htmlEscape(String text) { 
    return text.replaceAll("&", "&amp;") 
     .replaceAll("<", "&lt;") 
     .replaceAll(">", "&gt;") 
     .replaceAll('"', "&quot;") 
     .replaceAll("'", "&apos;"); 
} 

Future<String> readStreamAsString(InputStream stream) { 
    final completer = new Completer(); 
    final sb = new StringBuffer(); 
    final sis = new StringInputStream(stream); 
    sis 
    ..onData =() { sb.add(sis.read()); } 
    ..onClosed =() { completer.complete(sb.toString()); } 
    ..onError = (e) { completer.completeException(e); }; 
    return completer.future; 
} 

然后,在客户端:

import 'dart:html'; 
import 'dart:json'; 

main(){ 
    final input = query('#datas') as InputElement; 
    final datas = JSON.parse(input.value); 
    //... 
} 
+0

没错我在找什么!谢谢。如果这是在某种程度上建立在语言上,那将会很棒。客户端可以与之交互的服务器端模板。 – basheps

相关问题