Você criou um endpoint que recebe arquivos: um usuário envia uma foto para POST /avatars ou seu aplicativo envia um PDF assinado para POST /documents. Agora é preciso testar o fluxo via HTTP: selecionar um arquivo real, anexá-lo a um campo do formulário, enviar a requisição e validar a resposta.
Uploads exigem alguns cuidados porque usam multipart/form-data, não JSON. Você precisa configurar corretamente os campos de arquivo e, ao automatizar testes, garantir que o arquivo exista na máquina onde o cenário será executado.
O Apidog permite montar e testar essas requisições. Neste guia, você vai:
- enviar um único arquivo;
- enviar arquivo e JSON na mesma requisição;
- validar a resposta;
- executar uploads em cenários, Runner e CLI;
- evitar erros de caminho de arquivo em automações.
Para entender a estrutura do protocolo, consulte o guia sobre upload de arquivos em APIs e a referência do MDN sobre FormData.
O que é multipart/form-data e por que uploads precisam dele
Uma requisição HTTP pode enviar corpo em vários formatos: form-data, x-www-form-urlencoded, JSON, XML, raw ou binário. Para a maioria dos endpoints, JSON resolve. Para uploads, use form-data.
Ao selecionar form-data, a requisição usa:
Content-Type: multipart/form-data
Esse formato divide o corpo em partes independentes. Cada parte possui nome e conteúdo próprios:
- uma parte pode ser uma string, como
title; - outra pode conter os bytes de uma imagem ou PDF;
- todas são enviadas na mesma requisição.
Por exemplo, um upload de avatar pode incluir o arquivo e uma legenda:
avatar: jane-profile.png
caption: Foto do perfil
Não confunda form-data com x-www-form-urlencoded:
| Formato | Use quando |
|---|---|
multipart/form-data |
Há arquivos, imagens, PDFs ou outros bytes no corpo |
x-www-form-urlencoded |
Há apenas campos escalares curtos, sem arquivos |
No Apidog, cada parâmetro de form-data possui um tipo. O ponto principal é mudar o tipo do campo que receberá o anexo para file. Assim, o Apidog envia o conteúdo do arquivo, não apenas um texto com seu nome ou caminho.
Envie um único arquivo e valide a resposta
Considere o endpoint:
POST /avatars
Ele recebe um campo avatar com uma imagem e retorna informações sobre o arquivo armazenado.
1. Configure o método, URL e corpo
No Apidog:
- Defina o método como
POST. - Informe a URL do endpoint, por exemplo:
https://api.example.com/avatars
- Abra a aba Body.
- Selecione form-data.
O Apidog define o Content-Type: multipart/form-data para a requisição.
2. Crie o campo de arquivo
Adicione uma linha de parâmetro:
| Chave | Tipo |
|---|---|
avatar |
file |
Mude o tipo de string para file. O campo de valor passa a oferecer um seletor de arquivo.
3. Selecione o arquivo local
Clique em Upload na linha avatar e selecione um arquivo local, por exemplo:
jane-profile.png
O Apidog registra o caminho local do arquivo para usar ao enviar a requisição.
Importante: o Apidog envia o arquivo, mas não armazena seus bytes na nuvem. O que fica salvo é o caminho local. Isso afeta execuções em outra máquina, Runner e CLI.
4. Envie a requisição
Clique em Send. Uma resposta bem-sucedida pode ser semelhante a:
{
"id": "usr_8842",
"avatarUrl": "https://cdn.example.com/avatars/usr_8842.png",
"sizeBytes": 48210,
"contentType": "image/png"
}
5. Adicione validações
Um status 200 sozinho não garante que o upload funcionou corretamente. Valide também os dados retornados.
Exemplo de validações pós-requisição:
status code == 200
$.avatarUrl exists
$.contentType == "image/png"
No Apidog, configure:
- uma validação para o código de status;
- uma validação JSONPath para confirmar que
$.avatarUrlexiste; - uma validação para confirmar o valor de
$.contentType.
Para mais operadores e exemplos de JSONPath, consulte o guia de validações de API.
O equivalente em curl seria:
curl -X POST https://api.example.com/avatars \
-F "avatar=@jane-profile.png"
A flag -F cria uma parte multipart. O prefixo @ instrui o curl a ler o conteúdo do arquivo local.
Envie arquivo e JSON na mesma requisição
Endpoints reais normalmente recebem mais do que um arquivo. Por exemplo:
POST /documents
Esse endpoint pode esperar:
- um PDF;
- um título;
- uma categoria;
- tags;
- outros metadados.
Campos simples: use parâmetros separados
Para valores escalares, adicione campos form-data adicionais:
| Chave | Tipo | Exemplo |
|---|---|---|
file |
file |
q3-invoice.pdf |
title |
string |
Q3 Invoice |
category |
string |
billing |
Todos os campos serão enviados na mesma requisição multipart.
Metadados estruturados: envie JSON como string
Se os metadados incluem objetos aninhados ou arrays, crie um campo metadata do tipo string e cole o JSON no valor:
{
"title": "Q3 Invoice",
"category": "billing",
"tags": ["invoice", "2026", "paid"]
}
A requisição passa a ter duas partes principais:
file: q3-invoice.pdf
metadata: {"title":"Q3 Invoice","category":"billing","tags":["invoice","2026","paid"]}
O servidor lê o arquivo em uma parte e interpreta o JSON na outra. Esse padrão é comum em APIs multipart, incluindo o endpoint descrito na documentação de upload de arquivos do Stripe.
Se você está migrando do Postman, consulte o guia sobre como fazer upload de um arquivo e dados JSON no Postman.
Envie múltiplos arquivos
Para anexar mais de um arquivo, adicione mais parâmetros do tipo file.
Exemplo para um endpoint que recebe um documento e sua miniatura:
| Chave | Tipo |
|---|---|
file |
file |
thumbnail |
file |
Cada campo terá seu próprio botão Upload. Não existe um modo especial para múltiplos anexos: crie uma linha para cada parte esperada pela API.
Transforme o upload em um cenário de teste repetível
Enviar uma requisição manualmente confirma apenas que o endpoint funcionou uma vez. Para detectar regressões, salve o fluxo como um cenário de teste.
Um fluxo típico seria:
- enviar
POST /avatars; - capturar o
idda resposta; - executar
GET /users/{id}; - validar que
avatarUrlfoi persistido.
O guia sobre como escrever um cenário de teste com Apidog explica como encadear etapas e reutilizar valores retornados.
Depois de salvar o cenário, você pode:
- executá-lo contra staging a cada deploy;
- adicionar ramificações com lógica condicional em cenários de teste de API;
- configurá-lo em um agendamento com testes de API agendados.
Há um detalhe importante: o cenário funciona localmente porque o arquivo existe na sua máquina. Essa premissa deixa de valer quando a execução ocorre em outro ambiente.
A pegadinha: o arquivo precisa existir onde o teste roda
O Apidog salva o caminho do arquivo, não o arquivo em si.
Localmente, isso parece transparente:
/Users/jane/pics/jane-profile.png
Mas esse caminho só é válido no computador da Jane. Se outra pessoa, um Runner ou uma máquina de CI tentar executar o cenário, esse arquivo não será encontrado.
Colaboração em equipe
Quando um colega abre sua requisição, ele pode ver o parâmetro avatar e o caminho salvo. Porém, ele não consegue enviar o arquivo se esse caminho apontar para seu disco local.
Para executar a requisição, o colega deve:
- ter uma cópia do arquivo na própria máquina;
- selecionar esse arquivo no campo de upload;
- usar um caminho válido para o ambiente dele.
Runner e CLI
O mesmo problema aparece em automação:
- o cenário passa no laptop;
- você agenda uma execução no Runner ou CI;
- a etapa de upload falha porque o arquivo não existe no host de execução.
A solução é sempre a mesma:
- copie o arquivo para a máquina que executará o teste;
- use um caminho acessível nessa máquina;
- atualize o campo de arquivo ou use uma variável de ambiente.
Configure uploads no Runner
O Runner lê arquivos disponíveis em um diretório do host montado no volume durante a implantação, usando a flag -v.
Fluxo recomendado:
- Monte um diretório do host no volume do Runner.
- Copie o arquivo para esse diretório.
- Abra os detalhes da etapa de upload no cenário.
- Clique em Batch Edit.
- Atualize o caminho do campo de arquivo.
Exemplo:
/opt/runner/jane-profile.png
O arquivo precisa estar dentro do diretório montado. Se ele estiver fora da montagem, o Runner não conseguirá encontrá-lo, mesmo que o caminho pareça correto.
Consulte a documentação do Apidog sobre requisições de upload de arquivos para os detalhes de montagem e edição em massa.
Configure uploads na CLI
Na CLI, a regra é idêntica: o arquivo deve existir na máquina que executa o comando.
Por exemplo:
/opt/apidog/runner/jane-profile.png
Atualize o caminho da etapa usando Batch Edit ou, preferencialmente, uma variável.
Use uma variável para evitar caminhos fixos
Em vez de salvar um caminho literal na etapa, use uma variável para o caminho do arquivo.
Exemplo conceitual:
{{upload_file_path}}
Defina valores diferentes por ambiente:
| Ambiente | Valor de upload_file_path
|
|---|---|
| Local | /Users/jane/pics/jane-profile.png |
| Runner | /opt/runner/jane-profile.png |
| CI | /opt/apidog/runner/jane-profile.png |
Assim, o cenário continua o mesmo em todos os ambientes. Apenas o valor da variável muda.
Automatize cenários de upload com a CLI do Apidog
Depois de salvar o cenário, execute-o sem interface gráfica em uma pipeline de CI.
Instale a CLI e autentique-se:
npm install -g apidog-cli
apidog login --with-token <YOUR_ACCESS_TOKEN>
Execute um cenário salvo por ID:
apidog run --access-token $APIDOG_ACCESS_TOKEN -t <scenario_id> -e <env_id> -r cli
Parâmetros:
| Parâmetro | Descrição |
|---|---|
-t |
ID do cenário de teste |
-e |
ID do ambiente |
-r |
Reporter: cli, html ou junit
|
Para múltiplos reporters, separe os valores por vírgula.
A CLI executa os cenários salvos no projeto e retorna códigos de saída que podem controlar o status da pipeline. Veja o guia de instalação da CLI do Apidog para os detalhes de configuração.
Antes de executar um cenário com upload na CI, confirme:
- o arquivo foi copiado para o runner;
- o caminho configurado é válido no runner;
- a variável de caminho, caso exista, aponta para o local correto.
Para fluxos mais completos de CI, incluindo entradas por linha, consulte testes orientados a dados com a CLI do Apidog.
FAQ
Por que meu colega não consegue enviar minha requisição de upload?
Porque o Apidog salva o caminho local do arquivo, não o conteúdo do arquivo. Um caminho como:
/Users/jane/pics/jane-profile.png
só existe na máquina da Jane. Seu colega precisa ter uma cópia do arquivo e configurar um caminho válido na própria máquina.
O mesmo motivo explica por que testes agendados e execuções no Runner precisam preparar os arquivos antes de rodar o cenário.
Como envio JSON junto com um arquivo?
Use form-data:
- adicione o arquivo em um campo do tipo
file; - adicione outro campo do tipo
string; - cole o JSON nesse campo de texto.
O servidor receberá o arquivo em uma parte multipart e o JSON em outra.
Que caminho devo usar no Runner?
Use um caminho dentro do diretório montado com -v na implantação do Runner.
Exemplo:
/opt/runner/seuarquivo.jpg
Copie o arquivo para esse diretório e atualize a etapa com Batch Edit. Para a CLI, um caminho pode ser:
/opt/apidog/runner/seuarquivo.jpg
Existe limite de tamanho ou tipo de arquivo no Apidog?
Os limites efetivos dependem da API que você está testando. O Apidog constrói a requisição e lê o arquivo local; a validação de tamanho, extensão e MIME type é responsabilidade do servidor.
Teste explicitamente os casos esperados pela sua API:
- arquivo válido;
- tipo não permitido;
- arquivo grande demais;
- arquivo ausente;
- metadados inválidos.
Devo usar form-data ou x-www-form-urlencoded?
Use form-data para uploads.
Ele usa multipart/form-data e transporta arquivos. Use x-www-form-urlencoded apenas para formulários simples sem arquivos.
Conclusão
Testar upload de arquivos exige duas verificações:
- a requisição multipart precisa estar configurada corretamente;
- o arquivo precisa estar disponível na máquina que executa o teste.
No Apidog, o fluxo é direto:
- selecione
form-data; - defina o campo de anexo como
file; - faça upload do arquivo;
- adicione campos extras ou JSON como string;
- envie a requisição;
- valide status e corpo da resposta;
- para Runner ou CLI, use caminhos acessíveis ou variáveis por ambiente.
Quer testar no seu endpoint? Baixe o Apidog, crie uma requisição form-data para sua rota de upload e valide a resposta.
Top comments (0)