2013-04-08 2 views
6

Wie lese ich HttpRequest Daten von POST-Methode vom Client, auf dem Server, in Dart gesendet?Wie HttpRequest Daten vom Client gesendet werden, auf Server

ich eine Nachricht von dem Client wie folgt senden:

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); 

Auf Server ich die Anfrage wie folgt bin Fang:

HttpServer.bind('127.0.0.1', 8081).then((server) { 
server.listen((HttpRequest request) { 

//DATA SHOULD BE READ HERE 



}); 
}); 

Aber ich kann nicht herausfinden, wie man tatsächlich die Daten zu lesen. .. Es gibt keine Daten Eigentum in Httprequest noch etwas anderes ...

EDIT Dies ist, wie ich die Antwort bekommen:

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); 
     }); 
    } 
}); 
}); 

Aber aus irgendeinem Grunde die request.method nicht „POST“, sondern „OPTIONEN“ ist, und wenn ich zu if(request.method == "OPTIONS") ändern, dann drucken (postdata) noch nichts zurückgeben ...

Antwort

1

Gerade jetzt, die Die Handhabung von POST-Daten ist etwas schwierig. Aber im Wesentlichen muss die HttpRequest selbst "angehört" werden. HttpRequest is a stream itself. Insbesondere ist es ein Stream<List<int>>. Also im Grunde können Ihre Daten als List<int> an Ihre HttpRequest übergeben werden. Also müssen wir die Daten rekonstruieren und sie dann in eine Zeichenkette konvertieren (vorausgesetzt, Sie erwarten eine Zeichenkette, keine binären Daten usw.). Hier ist mehr oder weniger, was ich tue:

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(); 
}); 

Beachten Sie, dass die request.listen(dataBody.AddAll, ...) im Grunde ruft List.addAll() jedes Mal Daten an den Server ist (im Fall von größeren Daten oder mehrteiligen Formen, die sie nicht alle auf einmal kommen können). Dies stellt sicher, dass wir alles zwischenspeichern, bis der Stream anzeigt, dass es 'fertig' ist. In diesem Fall können wir nun etwas mit den Daten, die wir erhalten haben, machen, z. B. in eine Zeichenkette umwandeln.

+0

danken Ihnen für Ihre Hilfe, aber das hat nicht funktioniert. Ich habe meinen ursprünglichen Post mit der Info aktualisiert ... – deloki

+0

Ich habe auch meinen Code aktualisiert. Der Options-Header ist der Client (Web-Browser), der den Server fragt, welche Funktionalität er unterstützt. In diesem Fall (ich nehme einen Testfall an) können Sie es verwerfen, da es dann die POST-Anfrage selbst sendet.Leider hatte ich vorher vergessen den Stream zu schließen, so dass es nicht dazu kam. Weitere Details zu HTTP-Anfrage-Typen finden Sie hier: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html –

+0

Ich habe nicht eine close() -Methode in HttpRequest – deloki

1

Sie können den StringDecoder verwenden, um von "List of Int" in "String" von der HttpRequest zu transformieren. Da egal, ob Sie json, plain text oder png senden, sendet Dart immer Daten in Form von "List of Int" an den Server. Ein anderes Mittel ist die Streams (http://www.dartlang.org/articles/feet-wet-streams/) auf Heroku Steam v0.6.2 Dart Editor getestet 0.4.3_r20602 Dat SDK 0.4.3.5_r26062

Zum Beispiel

der Kunde:

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); 
} 

der Server:

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(); 
    } 
    } 

co nfigure.dart

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

Ich habe dieses nützliches Beispiel mit Client/Side-Code gefunden

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); 
}