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.

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 removidoIncompatí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 removidoIncompatí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 adicionadoIncompatí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 alteradoIncompatí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 removidoIncompatí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çõesCompatí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.