# Rede e HTTP

> Sem cliente HTTP de alto nível — use java.net/OkHttp fora da paint thread, JSON com Jackson.

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

# Rede e HTTP

Outra página honesta: **o framework não traz um cliente HTTP de alto nível** (nada de `Http.get()`
ergonômico exposto ao app). Você usa **`java.net`** ou uma lib (OkHttp já está no classpath, usada
internamente pelos mapas).

## A regra obrigatória
**Faça a requisição fora da paint thread** e **volte com `Component.onUI(...)`** para tocar a UI (ver
[Trabalho em background](/docs/data-and-services/background-work)).

## Baixar bytes — `Utils.getRemoteFile(url)`
Atalho para baixar o conteúdo de uma URL:
```java
new Thread(() -> {
   byte[] dados = Utils.getRemoteFile("https://api.exemplo.com/dados");  // null em erro OU em 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`** em erro HTTP, exceção **e em WebGL/TeaVM** — sempre cheque.

## JSON com Jackson (não Gson)
O padrão do projeto é **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 com `java.net`
Quando precisar de controle (headers, POST), use `HttpURLConnection`/OkHttp diretamente — sempre numa
thread de fundo, resultado de volta com `onUI(...)`.

## ⚠️ Limitações em WebGL/TeaVM
No alvo Web, as chamadas HTTP têm **restrições** (CORS, sem sockets diretos) e `getRemoteFile` retorna
`null`. Trate esse caso ou desabilite o recurso no Web (ver [platforms](/docs/platforms)).

## Boas práticas
- **Nunca** faça rede na paint thread — a UI congela.
- **Jackson**, não Gson (consistência com o resto do projeto).
- Cheque `null`/exceção em toda resposta; mostre erro ao usuário via `Hint`/`Alert`.

## Erros comuns
- Procurar `Http.get()`/cliente pronto — não existe; use `java.net`/OkHttp.
- Ignorar que `getRemoteFile` é `null` em WebGL.
- Parsear/tocar UI direto na thread de rede (sem `onUI`).

## Veja também
- [Trabalho em background](/docs/data-and-services/background-work) · [Gerência de estado](/docs/data-and-services/state-management)
