3

我正在使用路由来处理对我的服务器的 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);
}); 

我正在尝试获取要发布到 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);
}
4

2 回答 2

1

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

否则你可以试试

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

BroadcastStream 支持多个侦听器。本文中的更多信息将流用于数据

于 2013-12-31T11:51:33.677 回答
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 数据。正如这里提到的。此外,监听响应是异步完成的,因此必须在调用 close() 之前完成。

于 2014-01-03T15:56:04.033 回答