2013-04-08 25 views
6

Come leggo i dati HttpRequest inviati dal metodo POST dal client, sul server, in Dart?Come leggere i dati HttpRequest inviati dal client, sul server

mando un messaggio dal client in questo modo:

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

Sul server di Io sono recuperando la richiesta in questo modo:

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

//DATA SHOULD BE READ HERE 



}); 
}); 

Ma Non riesco a capire come leggere effettivamente i dati. .. Non c'è la proprietà dei dati in HttpRequest né altro ...

EDIT Ecco come ottengo la risposta ora:

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

Ma per qualche motivo il request.method non è "POST", ma "OPZIONI", e se cambio a if(request.method == "OPTIONS"), quindi stampare (postData) restituirà ancora niente ...

risposta

1

In questo momento, il la gestione dei dati POST è un po 'difficile. Ma essenzialmente la stessa HttpRequest deve essere "ascoltata". HttpRequest is a stream itself. In particolare è un Stream<List<int>>. Quindi in pratica i tuoi dati possono essere passati a HttpRequest come multipli di List<int>. Quindi dobbiamo ricostruire i dati e convertirli in una stringa (supponendo che ti aspetti una stringa, non dati binari, ecc.). Ecco più o meno quello che faccio:

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

Si noti che il request.listen(dataBody.AddAll, ...) chiama fondamentalmente List.addAll() ogni volta che i dati sono al server (in caso di dati più grandi o forme più parti potrebbe non venire tutti in una volta). Questo ci assicura di bufferizzarlo tutto fino a quando il flusso indica che è 'fatto' Nel qual caso ora possiamo fare qualcosa con i dati che abbiamo ricevuto, come convertirlo in una stringa.

+0

grazie per il vostro aiuto, ma questo non ha funzionato. Ho aggiornato il mio post originale con le informazioni ... – deloki

+0

Ho anche aggiornato il mio codice. L'intestazione Options è il client (browser Web) che chiede al server quali funzionalità supporta. In questo (presumo il caso di test) puoi scartarlo, in quanto invierà la richiesta POST stessa.Sfortunatamente avevo dimenticato in precedenza di chiudere lo stream in modo che non si verificasse. Ulteriori dettagli sui tipi di richieste HTTP possono essere trovati qui: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html –

+0

non ho un metodo close() in HttpRequest – deloki

1

È possibile utilizzare StringDecoder per trasformare da "Elenco di Int" a "String" da HttpRequest. Poiché non importa se si invia json, plain text o png, Dart invia sempre i dati sotto forma di "List of Int" al server. Un altro mezzo è quello di utilizzare gli Stream (http://www.dartlang.org/articles/feet-wet-streams/) testati su Heroku Steam v0.6.2 Dart Editor 0.4.3_r20602 Dat SDK 0.4.3.5_r26062

Per esempio,

il cliente:

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

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

Ho trovato questo esempio utile con codice client/lato

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