📝 Exercícios e Quizzes

Ponha em prática os teus conhecimentos sobre consumo de APIs em PHP com estes exercícios interativos.

🎯 Quiz Geral

Pergunta 1 HTTP

Qual método HTTP deves usar para criar um novo recurso numa API REST?

Pergunta 2 JSON

Qual função PHP converte uma string JSON num array associativo?

Pergunta 3 cURL

Qual opção do cURL define que a resposta deve ser retornada como string em vez de imprimida?

Pergunta 4 Guzzle

No Guzzle, como passas dados JSON no body de um pedido POST?

Pergunta 5 HTTP Status

Qual código HTTP indica que o pedido foi bem-sucedido e um novo recurso foi criado?

Pergunta 6 Autenticação

Qual header é usado para enviar um Bearer token numa requisição HTTP?

📚 Exercícios de Fundamentos

▼

Exercício 1: Verbos HTTP

Problema: Associa cada verbo HTTP à sua função correta:

  • Obter dados de um recurso → ?
  • Criar um novo recurso → ?
  • Substituir completamente um recurso → ?
  • Atualizar parcialmente um recurso → ?
  • Remover um recurso → ?
  • GET - Obter dados de um recurso
  • POST - Criar um novo recurso
  • PUT - Substituir completamente um recurso
  • PATCH - Atualizar parcialmente um recurso
  • DELETE - Remover um recurso
▼

Exercício 2: Converter JSON

Problema: Como converter este JSON para um array PHP e aceder ao nome?

{"id": 1, "nome": "Maria", "email": "maria@exemplo.com"}
<?php
$json = '{"id": 1, "nome": "Maria", "email": "maria@exemplo.com"}';
$array = json_decode($json, true);

echo $array['nome']; // "Maria"
?>
▼

Exercício 3: Query String

Problema: Como construir uma URL com query string a partir de um array?

Array: ['page' => 2, 'limit' => 10, 'sort' => 'desc']

<?php
$params = ['page' => 2, 'limit' => 10, 'sort' => 'desc'];
$url = 'https://api.exemplo.com/users?' . http_build_query($params);
// Resultado: https://api.exemplo.com/users?page=2&limit=10&sort=desc
?>

📄 Exercícios de file_get_contents

▼

Exercício 1: GET Simples

Problema: Usa file_get_contents() para obter o post com ID 5 da API JSONPlaceholder e mostrar o título.

<?php
$url = 'https://jsonplaceholder.typicode.com/posts/5';
$response = file_get_contents($url);
$data = json_decode($response, true);

echo "Título: " . $data['title'];
?>
▼

Exercício 2: POST com JSON

Problema: Cria um novo post via POST com file_get_contents() e stream_context_create().

<?php
$url = 'https://jsonplaceholder.typicode.com/posts';
$data = [
    'title' => 'Meu Post',
    'body' => 'Conteúdo do post',
    'userId' => 1
];

$context = stream_context_create([
    'http' => [
        'method' => 'POST',
        'header' => 'Content-Type: application/json',
        'content' => json_encode($data)
    ]
]);

$response = file_get_contents($url, false, $context);
$result = json_decode($response, true);

echo "Post criado com ID: " . $result['id'];
?>
▼

Exercício 3: Headers Customizados

Problema: Faz um pedido GET com headers de Authorization e User-Agent.

<?php
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => [
            'Authorization: Bearer meu_token',
            'User-Agent: MeuApp/1.0',
            'Accept: application/json'
        ]
    ]
]);

$response = file_get_contents('https://api.exemplo.com/dados', false, $context);
?>

🔄 Exercícios de cURL

▼

Exercício 1: GET com Timeout

Problema: Faz um pedido GET com timeout de 5 segundos e tratamento de erros.

<?php
$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => 'https://jsonplaceholder.typicode.com/posts',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 5,
    CURLOPT_CONNECTTIMEOUT => 3
]);

$response = curl_exec($ch);

if ($response === false) {
    echo "Erro: " . curl_error($ch);
} else {
    $data = json_decode($response, true);
    print_r($data);
}

curl_close($ch);
?>
▼

Exercício 2: PUT Request

Problema: Atualiza um post existente usando PUT com cURL.

<?php
$data = [
    'id' => 1,
    'title' => 'Título Atualizado',
    'body' => 'Conteúdo atualizado',
    'userId' => 1
];

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => 'https://jsonplaceholder.typicode.com/posts/1',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => 'PUT',
    CURLOPT_POSTFIELDS => json_encode($data),
    CURLOPT_HTTPHEADER => ['Content-Type: application/json']
]);

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($httpCode === 200) {
    $result = json_decode($response, true);
    echo "Atualizado: " . $result['title'];
}
?>
▼

Exercício 3: Upload de Ficheiro

Problema: Faz upload de um ficheiro usando cURL e CURLFile.

<?php
$filePath = '/caminho/para/ficheiro.jpg';

$ch = curl_init();

curl_setopt_array($ch, [
    CURLOPT_URL => 'https://api.exemplo.com/upload',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => [
        'file' => new CURLFile($filePath, 'image/jpeg', 'foto.jpg'),
        'descricao' => 'Minha foto'
    ]
]);

$response = curl_exec($ch);
curl_close($ch);
?>

📦 Exercícios de Guzzle

▼

Exercício 1: Cliente Configurado

Problema: Cria um cliente Guzzle com base_uri, timeout e header de autorização.

<?php
use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://jsonplaceholder.typicode.com',
    'timeout' => 5.0,
    'headers' => [
        'Authorization' => 'Bearer ' . getenv('API_TOKEN'),
        'Accept' => 'application/json'
    ]
]);

$response = $client->get('/posts/1');
$data = json_decode($response->getBody(), true);
?>
▼

Exercício 2: Pedidos Paralelos

Problema: Faz 3 pedidos GET em paralelo usando promises do Guzzle.

<?php
use GuzzleHttp\Client;
use GuzzleHttp\Promise\Utils;

$client = new Client(['base_uri' => 'https://jsonplaceholder.typicode.com']);

$promises = [
    'posts' => $client->getAsync('/posts?_limit=5'),
    'users' => $client->getAsync('/users?_limit=5'),
    'comments' => $client->getAsync('/comments?_limit=5')
];

$results = Utils::settle($promises)->wait();

foreach ($results as $key => $result) {
    if ($result['state'] === 'fulfilled') {
        $data = json_decode($result['value']->getBody(), true);
        echo "$key: " . count($data) . " itens\n";
    }
}
?>
▼

Exercício 3: Tratamento de Erros

Problema: Faz um pedido com tratamento completo de erros (conexão e HTTP).

<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\RequestException;

$client = new Client(['base_uri' => 'https://jsonplaceholder.typicode.com']);

try {
    $response = $client->get('/posts/999999');
    $data = json_decode($response->getBody(), true);
    print_r($data);

} catch (ConnectException $e) {
    echo "Erro de conexão: " . $e->getMessage();

} catch (RequestException $e) {
    echo "Erro HTTP: " . $e->getCode();
    if ($e->hasResponse()) {
        $error = json_decode($e->getResponse()->getBody(), true);
        print_r($error);
    }
}
?>

📊 O Teu Progresso

0/9 módulos visitados

💡 Dica

Visita todas as páginas do curso para completares o teu progresso. Os exercícios completados são guardados automaticamente.