📝 Exercícios e Quizzes
Ponha em prática os teus conhecimentos sobre consumo de APIs em PHP com estes exercícios interativos.
🎯 Quiz Geral
Qual método HTTP deves usar para criar um novo recurso numa API REST?
Qual função PHP converte uma string JSON num array associativo?
Qual opção do cURL define que a resposta deve ser retornada como string em vez de imprimida?
No Guzzle, como passas dados JSON no body de um pedido POST?
Qual código HTTP indica que o pedido foi bem-sucedido e um novo recurso foi criado?
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
Visita todas as páginas do curso para completares o teu progresso. Os exercícios completados são guardados automaticamente.