HttpClient.getUrl în Dart

HTTP (dart:io) Dart 1.0

getUrl deschide o cerere GET (citire), postUrl o cerere POST (trimitere de date) spre adresa dată.

Sintaxă
Future<HttpClientRequest> getUrl(Uri url)
Future<HttpClientRequest> postUrl(Uri url)

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ște Uri.http sau Uri.https cu un map de parametri.
  • Setezi antetele după ce ai scris în corp: antetele pleacă primele, iar modificarea lor după write aruncă 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.