在已经收听流之后使用Dart Route处理POST数据

时间:2013-12-31 00:04:12

标签: dart dart-io dart-async

我正在使用route来处理对我的服务器的http请求。这是我目前的路线代码:

 
HttpServer.bind("127.0.0.1", 8080).then((server) {
    new Router(server)
    ..filter(new RegExp(r'/.*'), addCorsHeaders)
    ..filter(new RegExp(r'/admin/.*'), authenticate)
    ..serve(userGetURL, method: 'GET').listen(userGetHandler)
    ..serve(userPostURL, method: 'POST').listen(userPostHandler);
}); 

我正在尝试获取我正在POST到URL的JSON数据。数据将用于从数据库中获取实体并将其作为JSON返回给调用者。我基本上试图创建一个服务器应用程序来处理所有数据和一个将显示它的客户端应用程序。

我无法弄清楚如何从POST获取数据。我尝试的一切都要求我听流,但它已经被听了。这就是我试图获取POST数据的方式:

userPostHandler(HttpRequest req) {
    req.listen((List<int> buffer) {
        // Return the data back to the client.
        res.write(new String.fromCharCodes(buffer));
        res.close();
    }
}

问题是我收到Bad state: Stream has already been listened to.错误。

编辑:过滤器

Future<bool> authenticate(HttpRequest req) {
  if (req.method == 'POST') {
    // Post data is not null
    // Authenticate user
    String userName = '';
    String password = '';
    User user = new User();
    user.DBConnect().then((User user) {
      return new Future.value(user.ValidateUser(userName, password));
    });
  }
}

Future<bool> addCorsHeaders(HttpRequest req) {
  print('${req.method}: ${req.uri.path}');
  req.response.headers.add('Access-Control-Allow-Origin', '*, ');
  req.response.headers.add('Access-Control-Allow-Methods', 'POST, OPTIONS, GET');
  req.response.headers.add('Access-Control-Allow-Headers',
      'Origin, X-Requested-With, Content-Type, Accept');
  return new Future.value(true);
}

2 个答案:

答案 0 :(得分:1)

我从未使用过Route包,但我想知道你为什么要在Handler里面听。你不能只访问你想要处理的属性吗?

否则你可以尝试

req.asBroadcastStream().listen(...)

BroadcastStream支持多个侦听器。 本文中的更多信息Use Streams for Data

答案 1 :(得分:0)

使用以下代码我可以使用POST:

void main() {
    HttpServer.bind("127.0.0.1", 8080).then((server) {
        new Router(server)
        ..filter(new RegExp(r'/.*'), addCorsHeaders)
          ..filter(new RegExp(r'/admin/.*'), authenticate)
           ..serve(userGetURL, method: 'GET').listen(userGetHandler)
            ..serve(userPostURL, method: 'POST').listen(userPostHandler);
    }); 
}

Future userPostHandler(HttpRequest req) {
  bool headerSent = false;
  // Start listening before writing to the response.
  req.listen((List<int> buffer) {
    if (!headerSent) {
      req.response.write("User POST");
      headerSent = true;
    }
    req.response.write(new String.fromCharCodes(buffer));
    },
    // Use onDone to close the response.
    onDone: () => req.response.close()
  );
}

这是我想出来的。对响应的任何写入都会自动消耗主体,从而破坏POST数据。如上所述here。此外,监听响应是异步完成的,因此必须在调用close()之前完成。