OpenAPI Diff
Uma comparação OpenAPI confronta duas versões de uma especificação de API —o contrato antigo e o novo— e relata o que realmente mudou: endpoints removidos, parâmetros que se tornaram obrigatórios, campos cujo tipo mudou, valores de enumeração que desapareceram. Carregue ou cole ambas as especificações abaixo e esta página classifica cada alteração como incompatível ou compatível, para julgar uma atualização de um fornecedor, ou a sua própria versão, antes de chegar a produção. Ambos os ficheiros são analisados nesta página, no seu dispositivo: nada é enviado, algo importante porque as especificações descrevem endpoints internos que pode não querer no servidor de outra pessoa. Novo neste vocabulário? O artigo complementar, as alterações incompatíveis de API, explicadas, define cada termo usado aqui.
Última atualização:
Especificação antiga (o contrato que os clientes usam hoje)
Largue um ficheiro em qualquer lugar deste painel, escolha um ou cole o texto. A análise é local; nada sai deste dispositivo.
Especificação nova (o contrato candidato)
Largue um ficheiro em qualquer lugar deste painel, escolha um ou cole o texto. A análise é local; nada sai deste dispositivo.
Resultado da comparação
Resumo copiado para a área de transferência.
O que esta ferramenta verifica — e o que «incompatível» realmente significa
Uma alteração é incompatível quando um cliente escrito corretamente contra a especificação antiga pode falhar contra a nova sem mudar uma linha do seu próprio código. Essa definição guia cada veredicto desta página. Remover um caminho ou uma operação é incompatível porque as chamadas existentes não têm para onde ir. Remover um estado de resposta —sobretudo um 2xx— é incompatível porque o tratamento de erros do cliente foi escrito em torno do conjunto antigo. Adicionar um parâmetro obrigatório ou uma propriedade de pedido obrigatória é incompatível porque o pedido válido de ontem é subitamente rejeitado. Mudar o tipo ou o formato de um campo é incompatível porque analisadores, validadores e SDK gerados dependem do tipo declarado. Remover um valor de enumeração é incompatível porque um cliente pode continuar a enviá-lo, ou guardar dados que já não consegue interpretar. Tudo o resto —um endpoint novo, um parâmetro opcional, um campo de resposta novo, um valor de enumeração novo, um código de estado novo— é relatado como compatível: os clientes antigos continuam a funcionar, mesmo que ainda não possam usar a nova capacidade.
A comparação é estrutural, não textual. Ambos os documentos são normalizados no mesmo modelo antes de qualquer comparação: cada caminho e operação, os seus parâmetros indexados por nome e localização, o seu corpo de pedido e cada resposta reduzidos a uma assinatura de esquema: um resumo determinístico de tipos, formatos, nomes de propriedades, listas de obrigatórios e valores de enumeração, construído recursivamente e com as referências locais $ref resolvidas. É por isso que reordenar chaves, reformatar espaços ou reescrever cada descrição produz uma comparação vazia: nada disso muda o contrato. E é por isso que uma alteração enterrada a três níveis dentro de um esquema referenciado também é encontrada: a assinatura expande a referência em vez de comparar o seu nome.
São aceites duas formas de entrada porque o ecossistema publica ambas: primeiro tenta-se JSON e, quando isso falha, o texto é analisado como YAML, o formato que a maioria dos documentos OpenAPI escritos à mão usa. Os documentos Swagger 2.0 também funcionam, incluindo os seus parâmetros in: body e os esquemas por resposta. Deliberadamente não há obtenção remota nem envio: cole os documentos ou largue os ficheiros, tal como faria com uma captura HAR, e a comparação é executada quando prime o botão —não a cada tecla—, pelo que duas especificações grandes coladas continuam responsivas.
Use o resultado como uma porta de publicação, não como decoração. Numa revisão, a lista de incompatíveis é a agenda: cada entrada precisa de uma correção, uma subida de versão, uma janela de obsolescência ou uma decisão escrita de que a rutura é intencional e foi comunicada. A lista de compatíveis é o rascunho do registo de alterações. Exportar a comparação como JSON permite arquivar essa decisão junto à versão, e o resumo copiável entra diretamente num pedido de alteração: a mesma disciplina que aplicaria a uma alteração de contrato de webhook, onde uma carga alterada em silêncio quebra todos os subscritores de uma só vez.
Limites honestos, ditos com clareza. Esta ferramenta compara o contrato declarado: não consegue ver o comportamento que a especificação não declara, como um campo que mantém o tipo mas muda o significado, uma regra de negócio nova, limites de taxa mais apertados ou uma mensagem de erro que os clientes analisavam (imprudentemente). Segue as referências locais e compara esquemas até uma profundidade limitada, pelo que os esquemas patologicamente aninhados ou mutuamente recursivos são resumidos em vez de expandidos para sempre. E uma comparação com zero alterações incompatíveis não é uma promessa de que uma atualização seja segura: é a evidência de que o contrato documentado se manteve, que é exatamente a evidência que vale a pena ter antes de implementar.
A tabela de classificação contra a qual esta página pontua
| Caminho ou operação removido | Incompatível. As chamadas a um endpoint que já não existe falham de imediato; não há forma compatível de um cliente antigo continuar a funcionar contra ele. |
| Estado de resposta removido | Incompatível. A lógica de novas tentativas, tratamento de erros e monitorização do cliente é escrita contra o conjunto de estados declarado; perder um 2xx é a forma mais grave. |
| Parâmetro que se tornou obrigatório / campo obrigatório adicionado | Incompatível. Os pedidos válidos sob a especificação antiga são rejeitados pela nova, pelo que cada cliente existente tem de mudar antes de poder chamar o endpoint. |
| Tipo ou formato alterado | Incompatível. Analisadores, validadores e SDK gerados são construídos a partir do tipo declarado; de integer para string (ou de int32 para int64) quebra os clientes rigorosos mesmo quando os valores parecem semelhantes. |
| Propriedade removida (pedido ou resposta) | Incompatível. Uma propriedade de pedido que os clientes enviam é ignorada ou rejeitada; uma propriedade de resposta que os clientes leem torna-se nula ou ausente no seu código. |
| Valor de enumeração removido | Incompatível. Os clientes podem continuar a enviar o valor removido, ou guardar dados que o usam. Os valores adicionados são compatíveis e são relatados separadamente. |
| Adições | Compatível. Caminhos, operações, parâmetros opcionais, propriedades de pedido opcionais, propriedades de resposta, estados de resposta e valores de enumeração novos nunca invalidam uma interação previamente válida. |
Perguntas frequentes
Os meus ficheiros de especificação são enviados para algum lado?
Não. Ambos os documentos são analisados e comparados nesta página, no seu dispositivo; compará-los não faz nenhum pedido de rede e nada é armazenado. É uma regra deliberada: uma especificação é um mapa da sua API —incluindo os endpoints internos e não documentados— e uma ferramenta que lhe pedisse para a enviar para a comparar estaria a recolher exatamente o mapa que deve manter privado.
Que formatos são aceites?
OpenAPI 3.x e Swagger 2.0, como JSON ou YAML. O texto é tentado primeiro como JSON e analisado como YAML quando isso falha. Um documento tem de ter um objeto paths para ser reconhecido como especificação; qualquer outra coisa é relatada como «não é uma especificação» em vez de produzir silenciosamente uma comparação vazia.
O que conta aqui como alteração incompatível?
Tudo o que pode fazer falhar um cliente antigo bem escrito: caminhos, operações ou estados de resposta removidos; parâmetros ou propriedades de pedido que se tornaram obrigatórios; alterações de tipo ou formato; propriedades de pedido ou resposta removidas; e valores de enumeração removidos. Adicionar qualquer coisa opcional é compatível. As alterações de descrição, título e formatação são ignoradas por completo: não são alterações de contrato.
Como são tratados os esquemas referenciados?
As referências locais como #/components/schemas/Pet (ou #/definitions/Pet no Swagger 2.0) são resolvidas ao construir as assinaturas, pelo que uma alteração dentro de um esquema partilhado é relatada em cada operação que o usa. A resolução tem profundidade limitada e é segura perante ciclos, pelo que os esquemas recursivos não podem bloquear a comparação.
Posso arquivar ou partilhar um resultado?
Sim. O botão de descarregamento exporta a comparação completa como JSON —as contagens do resumo mais cada alteração com a sua gravidade, tipo, caminho, método e detalhe estruturado— e o botão de copiar produz um resumo em texto simples para um pedido de alteração ou uma nota de versão. Ambos são gerados localmente a partir da comparação que acabou de executar.