> For the complete documentation index, see [llms.txt](https://docs.decentraland.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/rede/network-connections.md).

# Conexões de Rede

Como comunicar sua scene com servidores externos e APIs.

Sua scene pode aproveitar serviços externos que expõem APIs; você pode usar isso para obter dados de preço atualizados, dados meteorológicos ou qualquer outro tipo de informação exposta por uma API.

Você também pode configurar seu próprio server externo para ajudar sua scene e servir para sincronizar dados entre seus players. Isso pode ser feito com um server que expõe uma REST API, ou com um server que usa WebSockets.

## Chamar uma REST API

O código da sua scene pode enviar calls para uma REST API para buscar dados.

Como o server pode levar tempo para enviar sua response, você deve executar este comando como uma [função assíncrona](/creator/content-creator-pt/scenes-sdk7/padroes-de-programacao/async-functions.md), usando `executeTask()`.

```ts
executeTask(async () => {
	try {
		let response = await fetch(callUrl)
		let json = await response.json()
		console.log(json)
	} catch {
		console.log('falha ao acessar a URL')
	}
})
```

O comando fetch também pode incluir um segundo argumento opcional que agrupa headers, HTTP method e HTTP body em um único objeto.

* **url**: Endereço para enviar a request
* **init**: Um `RequestInit` object que pode conter:
  * **method** : Método HTTP a ser usado (GET, POST, DELETE, etc)
  * **body**: Conteúdo do body da request. Ele deve ser enviado como um objeto JSON serializado em string.
  * **headers**: Headers adicionais para incluir na request.
  * **redirect**: Estratégia de redirect ('follow' | 'error' | 'manual')
  * **timeout**: Quanto tempo esperar por uma response antes que a request falhe. Por padrão, 30000 milissegundos (30 segundos).

```ts
executeTask(async () => {
	try {
		let response = await fetch(callUrl, {
			headers: { 'Content-Type': 'application/json' },
			method: 'POST',
			body: JSON.stringify(myBody),
		})
		let json = await response.json()
		console.log(json)
	} catch {
		console.log('falha ao acessar a URL')
	}
})
```

O comando fetch retorna um `response` object com os seguintes dados:

* `headers`: Um `ReadOnlyHeaders` object. Chame o `get()` method para obter um header específico, ou o `has()` method para verificar se um header está presente.
* `ok`: Boolean
* `redirected`: Boolean
* `status`: Número do status code
* `statusText`: Texto para o status code
* `type`: Terá um dos seguintes valores: *basic*, *cors*, *default*, *error*, *opaque*, *opaqueredirect*
* `url`: URL que foi enviada
* `json()`: Obter o body em formato JSON.
* `text()`: Obter o body como texto.

{% hint style="warning" %}
**📔 Observação**: `json()` e `text()` são mutuamente exclusivos. Se você obtiver o body da response em um dos dois formatos, não poderá mais obter o outro do `response` objeto.
{% endhint %}

{% hint style="warning" %}
**📔 Observação**: Cada scene do Decentraland só tem permissão para executar um `fetch` comando por vez. Isso não tem efeito sobre como o código da scene deve ser estruturado, pois as requests são enfileiradas internamente. Se sua scene precisar enviar múltiplas requests para diferentes endpoints, tenha em mente que cada request só é enviada quando a anterior tiver sido respondida.
{% endhint %}

## Signed requests

Você pode empregar uma medida extra de segurança para certificar que uma request está se originando de uma player session dentro do Decentraland. Você pode enviar suas requests com uma assinatura adicional, que é assinada usando uma chave efêmera que a session do Decentraland gera para cada player com base no address do player. O server que recebe a request pode então verificar se a mensagem assinada de fato corresponde a um address que está atualmente ativo no mundo.

Esses tipos de medidas de segurança são especialmente valiosos quando pode haver um incentivo para um player abusar do sistema, para farmar tokens ou pontos em um jogo.

Para enviar uma request assinada, tudo o que você precisa fazer é usar a `signedFetch()` function, exatamente da mesma forma que você usaria a `fetch()` função.

```ts
import { signedFetch } from '~system/SignedFetch'

executeTask(async () => {
	try {
		let response = await signedFetch({
			url: callUrl,
			init: {
				headers: { 'Content-Type': 'application/json' },
				method: 'POST',
				body: JSON.stringify(myBody),
			},
		})

		if (!response.ok) {
			throw new Error('Resposta inválida')
		}

		let json = JSON.parse(response.body)

		console.log('Resposta recebida: ', json)
	} catch {
		console.log('falha ao acessar a URL')
	}
})
```

A request inclui uma série adicional de headers, contendo uma mensagem assinada e um conjunto de metadata para interpretá-la. A mensagem assinada consiste em todo o conteúdo da request criptografado usando a chave efêmera do player.

O `signedFetch()` difere da `fetch()` function no sentido de que a response é uma promise de uma mensagem HTTP completa, expressa como um `FlatFetchResponse` object. Isso inclui as seguintes properties:

* `body`
* `headers`
* `ok`
* `status`
* `statusText`

O **body** é sempre uma string, que você pode fazer parse como no exemplo acima.

### Validando uma request assinada

Para fazer uso de requests assinadas, o server que as recebe deve validar se as signatures correspondem ao restante da request e se o timestamp codificado dentro da signed message está atual.

Você pode encontrar um exemplo simples de um server executando essa tarefa na seguinte scene de exemplo:

[Validar autenticidade do player](https://github.com/decentraland-scenes/validate-player-authenticity)

## Timeout da request

Se uma HTTP request demorar demais para receber response, ela falha para que outras requests possam ser enviadas. Para `fetch()`, o limite padrão de timeout é de 30 segundos, mas você pode atribuir um valor diferente para cada request configurando a `timeout` property. O valor de `timeout` é expresso em milissegundos.

```ts
fetch('https://some-url.com', { timeout: 1000 })
```

## Usar WebSockets

Você também pode enviar e obter dados de um server WebSocket, desde que esse server use uma connection segura com *wss*.

```ts
var socket = new WebSocket('url')

socket.onmessage = function (event) {
	console.log('Mensagem WebSocket recebida:', event)
}
```

A sintaxe para usar WebSockets não é diferente da implementada nativamente por JavaScript. Veja a documentação do [Mozilla Web API](https://developer.mozilla.org/en-US/docs/Web/API/WebSocket) para detalhes sobre como capturar e enviar messages over WebSockets.

{% hint style="info" %}
**💡 Dica**: Uma biblioteca que simplifica o uso de conexões websocket e que foi comprovado que funciona muito bem com Decentraland é [Colyseus](https://colyseus.io/). Várias outras bibliotecas websocket não são compatíveis com o SDK do Decentraland.

Ele cria uma camada de abstração sobre as conexões websocket que torna reagir a mudanças e armazenar um estado de jogo consistente remotamente no server muito fácil. Você pode vê-lo em ação nestes exemplos:

* [Cube Jumper](https://github.com/decentraland-scenes/cube-jumper-colyesus-sdk7)
* [Space Traitor](https://github.com/decentraland-scenes/Space-Traitor)
* [AI NPC](https://github.com/decentraland-scenes/inworld-ai-sdk7)
  {% endhint %}

## Depurando requests de rede

Você pode depurar requests de rede abrindo o Debug Panel.

Para abrir o Debug Panel, você pode clicar no ![](https://2402076176-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FoPnXBby9S6MrsW83Y9qZ%2Fuploads%2Fgit-blob-92fe4dd70621a496d0da083ae9b5f9b2ef84d2dd%2Fdebug-icon.png?alt=media\&token=42a33cd5-b516-43ea-a6b3-8c33c21e4359) ícone no canto superior direito. Em seguida, selecione o **Solicitações Web** tab e clique **Abrir Chrome DevTools**.

Isso abrirá uma nova janela do Chrome com a aba Network aberta.

Veja [Depurar no Preview](/creator/content-creator-pt/scenes-sdk7/depuracao/debug-in-preview.md#web-requests) para mais detalhes.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.decentraland.org/creator/content-creator-pt/scenes-sdk7/rede/network-connections.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
