Ce face HttpServer
HttpServer.bind(adresă, port) pornește un server HTTP care ascultă pe adresa și portul date. Adresa poate fi InternetAddress.loopbackIPv4 (127.0.0.1, doar de pe calculatorul tău), InternetAddress.anyIPv4 (din toată rețeaua) sau un șir ca 'localhost'.
Dacă dai portul 0, sistemul alege un port liber; afli care cu getter-ul server.port. Este util în teste și în exemplele de pe această pagină, unde serverul și clientul sunt în același program.
Serverul este un Stream<HttpRequest>: primești fiecare cerere cu server.listen(...) sau cu await for (final cerere in server) și răspunzi prin cerere.response. await server.close() oprește serverul.
Parametri
| Parametru | Descriere |
|---|---|
address |
Adresa pe care ascultă serverul: InternetAddress sau șir. |
port |
Portul; 0 înseamnă „alege sistemul un port liber”. |
shared |
Opțional. Permite mai multor isolate să asculte pe același port. |
Ce returnează
Un Future<HttpServer>, completat când serverul ascultă.
Exemple
Exemplul 1: Server pe un port liber, apelat din același program
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
print('Adresă: ${server.address.address}');
print('Port ales de sistem: ${server.port > 0}');
server.listen((cerere) {
cerere.response
..write('Salut de la server!')
..close();
});
final client = HttpClient();
final raspuns = await (await client.getUrl(Uri.parse('http://127.0.0.1:${server.port}/'))).close();
print(await raspuns.transform(utf8.decoder).join());
client.close();
await server.close();
}
Rezultat
Adresă: 127.0.0.1
Port ales de sistem: true
Salut de la server!
Exemplul 2: Rute diferite pentru adrese diferite
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
server.listen((cerere) {
final raspuns = cerere.response;
switch (cerere.uri.path) {
case '/':
raspuns.write('Pagina principală');
case '/contact':
raspuns.write('Scrie-ne la contact@scoala.ro');
default:
raspuns
..statusCode = HttpStatus.notFound
..write('Nu există');
}
raspuns.close();
});
final client = HttpClient();
for (final cale in ['/', '/contact', '/admin']) {
final r = await (await client.getUrl(Uri.parse('http://127.0.0.1:${server.port}$cale'))).close();
print('$cale -> ${r.statusCode} ${await r.transform(utf8.decoder).join()}');
}
client.close();
await server.close();
}
Rezultat
/ -> 200 Pagina principală
/contact -> 200 Scrie-ne la contact@scoala.ro
/admin -> 404 Nu există
Exemplul 3: Server care rulează până îl oprești
Pornește programul și deschide http://localhost:8080/?nume=Ana în browser. Oprești serverul cu Ctrl+C.
import 'dart:io';
Future<void> main() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 8080);
print('Serverul ascultă pe http://localhost:${server.port}');
await for (final cerere in server) {
final nume = cerere.uri.queryParameters['nume'] ?? 'vizitator';
print('${cerere.method} ${cerere.uri}');
cerere.response
..headers.contentType = ContentType.html
..write('<h1>Bună, $nume!</h1>');
await cerere.response.close();
}
}
Rezultat în terminal, după o vizită din browser
Serverul ascultă pe http://localhost:8080
GET /?nume=Ana
GET /favicon.ico
Greșeli frecvente
- Pornești serverul pe un port deja folosit:
bindaruncăSocketException(„Address already in use”). Oprește celălalt program sau alege alt port. - Asculți pe
loopbackIPv4într-un container Docker sau pe un server: nimeni din afară nu se poate conecta. FoloseșteInternetAddress.anyIPv4. - Uiți
response.close(): browserul așteaptă la nesfârșit răspunsul.
Comenzi înrudite
HttpRequest: HttpRequest este o cerere primită de HttpServer: metoda (GET, POST), adresa (uri), antetele, corpul și răspunsul de trimis.HttpClient: HttpClient trimite cereri HTTP și HTTPS din programele Dart de consolă și server; close îl închide la final.HttpClient.getUrl: getUrl deschide o cerere GET (citire), postUrl o cerere POST (trimitere de date) spre adresa dată.sleep: Oprește complet execuția programului (isolate-ul curent) pentru durata dată; nimic altceva nu rulează între timp.