html5
  • dart
  • 2013-04-08 75 views 6 likes 
    6

    如何读取通过POST方法从Dart服务器上的客户端发送的HttpRequest数据?如何读取客户端发送的HttpRequest数据,服务器上

    我从客户端发送类似这样的消息:

    HttpRequest request = new HttpRequest(); 
    var url = "http://127.0.0.1:8081"; 
    request.open("POST", url, async: false); 
    
    String data = 'hello from client'; 
    request.send(data); 
    

    在服务器我正在追赶的要求是这样的:

    HttpServer.bind('127.0.0.1', 8081).then((server) { 
    server.listen((HttpRequest request) { 
    
    //DATA SHOULD BE READ HERE 
    
    
    
    }); 
    }); 
    

    但我无法弄清楚如何实际读取数据。 ..在HttpRequest中没有数据属性也没有其他的东西...

    编辑这是我现在如何得到答案:

    HttpServer.bind('127.0.0.1', 8081).then((server) { 
    server.listen((HttpRequest request) { 
        //DATA SHOULD BE READ HERE 
        print("got it"); 
        print(request.method); 
        if(request.method == "POST") { 
        print("got it 2"); 
        List<int> dataBody = new List<int>(); 
        request.listen(dataBody.addAll, onDone:() { 
         var postData = new String.fromCharCodes(dataBody); 
         print(postData); 
         }); 
        } 
    }); 
    }); 
    

    但由于某些原因将request.method不是“POST”,而是“OPTIONS”,如果我改变if(request.method == "OPTIONS"),然后打印(POSTDATA)仍然会返回什么...

    回答

    1

    眼下,处理POST数据有点困难。但基本上HttpRequest本身必须被'听'。 HttpRequest is a stream itself。特别是它是一个Stream<List<int>>。所以基本上你的数据可以作为多个List<int>传递给你的HttpRequest。所以我们需要重建数据,然后将其转换为字符串(假设您期望字符串,而不是二进制数据等)。这里或多或少我做什么:

    HttpServer.bind('127.0.0.1', 8081).then((server) { 
        server.listen((HttpRequest request) { 
        if(request.method == "POST") { 
        List<int> dataBody = new List<int>(); 
        request.listen(dataBody.addAll, onDone:() { 
         var postData = new String.fromCharCodes(dataBody); 
         // Do something with the data now. 
        }); 
        } 
        request.response.close(); 
    }); 
    

    注意,request.listen(dataBody.AddAll, ...)基本要求List.addAll()每一次数据到服务器(在更大的数据,或者可能不会一下子多部分形式的情况下)。这可以确保我们缓冲所有内容,直到流表明它已完成。在这种情况下,我们现在可以对收到的数据执行某些操作,例如将其转换为字符串。

    +0

    感谢你的帮助,但是这根本就不工作,有用的例子。我更新了我原来的信息... – deloki 2013-04-08 18:09:47

    +0

    我也更新了我的代码。 Options标题是客户端(Web浏览器)向服务器询问它支持的功能。在这里(我假设测试用例)可以丢弃它,因为它会自己发送POST请求。不幸的是,我以前忘记关闭流,以免发生。 关于HTTP请求类型的更多细节可以在这里找到:http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html – 2013-04-08 18:33:08

    +0

    我没有在HttpRequest的close()方法 – deloki 2013-04-08 19:11:25

    1

    您可以使用StringDecoder从HttpRequest中的“List of Int”转换为“String”。由于无论您发送json,纯文本还是png,Dart都始终以 “Int列表”的形式向服务器发送数据。另一种方法是使用在Heroku Steam v0.6.2 Dart Editor上测试的Streams(http://www.dartlang.org/articles/feet-wet-streams/) 0.4.3_r20602逸SDK 0.4.3.5_r26062

    例如,

    客户端:

    import 'dart:html'; 
    import 'dart:json' as Json; 
    import 'dart:async'; 
    import 'dart:uri'; 
    final String data = 'Hello World!'; 
    void _sendPNG(String pngData) { 
    HttpRequest request = new HttpRequest(); // create a new XHR 
    // add an event handler that is called when the request finishes 
    request.onReadyStateChange.listen((_) 
    { 
    if (request.readyState == HttpRequest.DONE && 
    (request.status == 200 || request.status == 0)) { 
    // data saved OK. 
    print(request.responseText); // output the response from the server 
    } 
            } 
    ); 
    // POST the data to the server Async 
    print('Sending Photos to the server...'); 
    var url = "/png"; 
    request.open("POST", url); 
    request.setRequestHeader("Content-Type", "text/plain"); 
    request.send(data); 
    } 
    

    服务器:

    import 'dart:io'; 
    import 'dart:async'; 
    import 'dart:json' as Json; 
    import "package:stream/stream.dart"; 
    import 'package:xml/xml.dart' as xml; 
    import 'package:unittest/unittest.dart'; 
    import 'package:rikulo_commons/mirrors.dart'; 
    void receivePNG(HttpConnect connect){ 
    var request = connect.request; 
    var response = connect.response; 
    if(request.uri.path == '/png' && request.method == 'POST') 
        { 
        String png=''; 
        response.write('The server received png request!'); 
        //read incoming List<int> data from request and use StringDecoder to transform incoming data to string 
        var stream = request.transform(new StringDecoder()); 
        stream.listen((value){ 
        print(value); 
        //Hello World! 
        } 
        else 
        { 
        response.write('error'); 
        response.statusCode = HttpStatus.NOT_FOUND; 
        connect.close(); 
        } 
        } 
    

    共nfigure.dart

    var _mapping = { 
        "/": home, 
        "/png": receivePNG, 
    }; 
    
    1

    我已经发现了与客户端/端代码

    GitHub json send to server Example

    // XXX: Dart Editor thinks this is OK, but I haven't run it. 
    
    import 'dart:html'; 
    
    String encodeMap(Map data) { 
        return data.keys.map((k) { 
        return '${Uri.encodeComponent(k)}=${Uri.encodeComponent(data[k])}'; 
        }).join('&'); 
    } 
    
    loadEnd(HttpRequest request) { 
        if (request.status != 200) { 
        print('Uh oh, there was an error of ${request.status}'); 
        return; 
        } else { 
        print('Data has been posted'); 
        } 
    } 
    
    main() { 
        var dataUrl = '/registrations/create'; 
        var data = {'dart': 'fun', 'editor': 'productive'}; 
        var encodedData = encodeMap(data); 
    
        var httpRequest = new HttpRequest(); 
        httpRequest.open('POST', dataUrl); 
        httpRequest.setRequestHeader('Content-type', 
               'application/x-www-form-urlencoded'); 
        httpRequest.onLoadEnd.listen((e) => loadEnd(httpRequest)); 
        httpRequest.send(encodedData); 
    } 
    
    相关问题