# Red y HTTP

> Sin cliente HTTP de alto nivel — usa java.net/OkHttp fuera del paint thread, JSON con Jackson.

Source: https://crossfly.dev/es/docs/data-and-services/networking-http — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Red y HTTP

Otra página honesta: **el framework no trae un cliente HTTP de alto nivel** (nada de `Http.get()`
ergonómico expuesto a la app). Usas **`java.net`** o una lib (OkHttp ya está en el classpath, usada
internamente por los mapas).

## La regla obligatoria
**Haz la petición fuera del paint thread** y **vuelve con `Component.onUI(...)`** para tocar la UI (ver
[Trabajo en segundo plano](/docs/data-and-services/background-work)).

## Descargar bytes — `Utils.getRemoteFile(url)`
Atajo para descargar el contenido de una URL:
```java
new Thread(() -> {
   byte[] dados = Utils.getRemoteFile("https://api.exemplo.com/dados");  // null en error O en WebGL
   if (dados == null) { Component.onUI(() -> Hint.show("Falha na rede", 2000)); return; }
   String corpo = new String(dados);
   Component.onUI(() -> mostrar(corpo));
}).start();
```
> ⚠️ `getRemoteFile` retorna **`null`** en error HTTP, excepción **y en WebGL/TeaVM** — comprueba siempre.

## JSON con Jackson (no Gson)
El estándar del proyecto es **Jackson** (`com.fasterxml.jackson.databind.ObjectMapper`):
```java
ObjectMapper mapper = new ObjectMapper();
new Thread(() -> {
   try {
      byte[] json = Utils.getRemoteFile("https://api.exemplo.com/clientes");
      if (json == null) return;
      List<Cliente> clientes = mapper.readValue(json, new TypeReference<List<Cliente>>(){});
      Component.onUI(() -> lista.setItems(clientes));
   } catch (Exception e) { Debug.log("parse: " + e); }
}).start();
```

## GET/POST con `java.net`
Cuando necesites control (headers, POST), usa `HttpURLConnection`/OkHttp directamente — siempre en un
hilo de fondo, resultado de vuelta con `onUI(...)`.

## ⚠️ Limitaciones en WebGL/TeaVM
En el destino Web, las llamadas HTTP tienen **restricciones** (CORS, sin sockets directos) y `getRemoteFile` retorna
`null`. Trata ese caso o deshabilita la función en Web (ver [platforms](/docs/platforms)).

## Buenas prácticas
- **Nunca** hagas red en el paint thread — la UI se congela.
- **Jackson**, no Gson (consistencia con el resto del proyecto).
- Comprueba `null`/excepción en toda respuesta; muestra el error al usuario vía `Hint`/`Alert`.

## Errores comunes
- Buscar `Http.get()`/cliente ya hecho — no existe; usa `java.net`/OkHttp.
- Ignorar que `getRemoteFile` es `null` en WebGL.
- Parsear/tocar la UI directamente en el hilo de red (sin `onUI`).

## Véase también
- [Trabajo en segundo plano](/docs/data-and-services/background-work) · [Gestión de estado](/docs/data-and-services/state-management)
