Ce face HttpClient.getUrl
client.getUrl(uri) deschide conexiunea și returnează un HttpClientRequest pentru o cerere GET, folosită pentru a citi date. Parametrii merg în adresă: Uri.parse('http://server/elevi?oras=Iași') sau Uri.http('server', '/elevi', {'oras': 'Iași'}), care codifică automat caracterele speciale.
client.postUrl(uri) face același lucru pentru o cerere POST, folosită pentru a trimite date. Înainte de close() setezi antetele (cerere.headers.contentType = ContentType.json) și scrii corpul cu cerere.write(...).
În ambele cazuri, await cerere.close() trimite cererea și returnează răspunsul. Pentru alte metode există putUrl, deleteUrl, patchUrl și openUrl('METODĂ', uri). Un status de eroare (404, 500) nu aruncă excepție: verifici raspuns.statusCode.
Parametri
| Parametru | Descriere |
|---|---|
url |
Adresa completă a resursei, ca Uri. |
Ce returnează
Un Future<HttpClientRequest>; după close() primești HttpClientResponse.
Exemple
Exemplul 1: GET cu parametri în adresă
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final elevi = {'Iași': ['Ana', 'Ion'], 'Cluj': ['Maria']};
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
server.listen((cerere) {
final oras = cerere.uri.queryParameters['oras'] ?? '';
cerere.response
..headers.contentType = ContentType.json
..write(jsonEncode(elevi[oras] ?? []))
..close();
});
final client = HttpClient();
for (final oras in ['Iași', 'Cluj', 'Arad']) {
final uri = Uri.http('127.0.0.1:${server.port}', '/elevi', {'oras': oras});
final raspuns = await (await client.getUrl(uri)).close();
final lista = jsonDecode(await raspuns.transform(utf8.decoder).join()) as List;
print('$oras: $lista');
}
client.close();
await server.close();
}
Rezultat
Iași: [Ana, Ion]
Cluj: [Maria]
Arad: []
Exemplul 2: POST cu un corp JSON
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
server.listen((cerere) async {
final date = jsonDecode(await utf8.decoder.bind(cerere).join()) as Map<String, dynamic>;
cerere.response
..statusCode = HttpStatus.created
..write('Am salvat nota ${date['nota']} pentru ${date['nume']}.');
await cerere.response.close();
});
final client = HttpClient();
final cerere = await client.postUrl(Uri.parse('http://127.0.0.1:${server.port}/note'));
cerere.headers.contentType = ContentType.json;
cerere.write(jsonEncode({'nume': 'Ana', 'nota': 10}));
final raspuns = await cerere.close();
print('Status: ${raspuns.statusCode}');
print(await raspuns.transform(utf8.decoder).join());
client.close();
await server.close();
}
Rezultat
Status: 201
Am salvat nota 10 pentru Ana.
Exemplul 3: Un răspuns 404 nu aruncă excepție
import 'dart:convert';
import 'dart:io';
Future<void> main() async {
final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0);
server.listen((cerere) {
cerere.response
..statusCode = HttpStatus.notFound
..write('Pagina ${cerere.uri.path} nu există.')
..close();
});
final client = HttpClient();
final raspuns = await (await client.getUrl(Uri.parse('http://127.0.0.1:${server.port}/orar'))).close();
final corp = await raspuns.transform(utf8.decoder).join();
if (raspuns.statusCode != HttpStatus.ok) {
print('Eroare ${raspuns.statusCode} ${raspuns.reasonPhrase}: $corp');
}
client.close();
await server.close();
}
Rezultat
Eroare 404 Not Found: Pagina /orar nu există.
Greșeli frecvente
- Construiești adresa prin concatenare (
'...?oras=' + oras): spațiile și diacriticele nu sunt codificate. FoloseșteUri.httpsauUri.httpscu un map de parametri. - Setezi antetele după ce ai scris în corp: antetele pleacă primele, iar modificarea lor după
writearuncăStateError. - Presupui că o cerere reușită are mereu status 200: verifică
statusCodeînainte de a decodifica JSON-ul.
Comenzi înrudite
HttpClient: HttpClient trimite cereri HTTP și HTTPS din programele Dart de consolă și server; close îl închide la final.HttpRequest: HttpRequest este o cerere primită de HttpServer: metoda (GET, POST), adresa (uri), antetele, corpul și răspunsul de trimis.HttpServer: HttpServer.bind pornește un server web pe o adresă și un port; serverul este un flux de cereri (HttpRequest).jsonEncode: Transformă hărți, liste, texte, numere, bool și null într-un text JSON; alte obiecte trebuie să aibă toJson().jsonDecode: Citește un text JSON și îl transformă în Map, List, String, num, bool sau null; dă FormatException la text greșit.