2013-04-08 12 views
6

Jak odczytać dane HttpRequest wysłane przez metodę POST z klienta, na serwerze, w Dart?Jak odczytać dane HttpRequest wysłane z klienta, na serwerze

wysłać wiadomość od klienta tak:

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

Na serwerze jestem połowu żądania tak:

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

//DATA SHOULD BE READ HERE 



}); 
}); 

Ale nie mogę dowiedzieć się, jak właściwie odczytać danych. .. Nie ma właściwości danych w HttpRequest ani nic innego ...

EDYCJA Oto, jak mogę uzyskać odpowiedź:

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

Ale z jakiegoś powodu nie jest request.method „POST” ale „Opcje”, a jeśli zmieni się if(request.method == "OPTIONS"), a następnie wydrukować (postData) będzie nadal nic nie powrócić ...

Odpowiedz

1

Teraz, obsługa danych POST jest trochę trudna. Ale zasadniczo sam HttpRequest musi być "słuchany". HttpRequest is a stream itself. W szczególności jest to Stream<List<int>>. Więc zasadniczo twoje dane mogą zostać przekazane do twojego HttpRequest jako wiele List<int>. Musimy więc zrekonstruować dane, a następnie przekonwertować je na ciąg (zakładając, że oczekujesz ciągu znaków, a nie danych binarnych itp.). Oto mniej więcej to, co robię:

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

Zauważ, że request.listen(dataBody.AddAll, ...) zasadzie nazywa List.addAll() każdym razem dane do serwera (w przypadku większych danych lub form wieloczęściowych nie mogą wejść na raz). To zapewnia, że ​​buforujemy wszystko, dopóki strumień nie wskaże, że jest "zrobione". W takim przypadku możemy teraz zrobić coś z danymi, które otrzymaliśmy, na przykład przekonwertować je na ciąg znaków.

+0

dziękuję za pomoc, ale to nie działa. zaktualizowałem swój pierwotny wpis informacją ... – deloki

+0

Zaktualizowałem również mój kod. Nagłówek opcji to klient (przeglądarka internetowa), który pyta serwer, jaką funkcjonalność obsługuje. W tym (zakładam, że jest to przypadek testowy), możesz go odrzucić, ponieważ wtedy sam wyśle ​​żądanie POST.Niestety wcześniej zapomniałem zamknąć strumień, aby nie nastąpiło. Więcej informacji na temat typów żądań HTTP można znaleźć tutaj: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html –

+0

Nie używam metody close() w HttpRequest – deloki

1

Możesz użyć StringDecoder do przejścia z "List of Int" do "String" z HttpRequest. Ponieważ niezależnie od tego, czy wysyłasz json, zwykły tekst czy png, Dart zawsze wysyła dane do serwera w postaci "Listy int". Innym sposobem jest użycie strumienia (http://www.dartlang.org/articles/feet-wet-streams/) przetestowanego w edytorze Dart Round Steam 0.6.2 0.4.3_r20602 Dat SDK 0.4.3.5_r26062

Na przykład

klient:

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

serwer:

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

Znalazłem ten użyteczny przykład z kodem klient/bocznej

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); 
} 
Powiązane problemy