Por que não há suporte ao tipo WSDL para API da Web?


33

Portanto, estou começando a usar o .Net WebApi e uma coisa que noto imediatamente é que não há contrato que defina a aparência e a API da API (solicitação / respostas de cada ação); isso geralmente é na forma de um WSDL para WCF / Soap.

Parece-me que isso é algo que seria muito valioso e tornaria a vida muito mais fácil para os consumidores da sua API.

Existe uma razão para não haver uma? Existe um paradigma ou princípio de programação que eu desconheço? Existe uma maneira de criar uma?


3
Relacionado: Por que as pessoas pensam que o SOAP está obsoleto? . tl; dr: Soap e WSDL são tão 2007, e REST é atualmente a bomba.
Robert Harvey

Muitos lugares que forneceram alguma API amplamente usada geralmente têm bibliotecas para vários idiomas que você pode usar para consumir sua API. Para os lugares que não fornecem um, geralmente há um projeto de código aberto para ele. Por exemplo, twilio para C # aqui, github.com/twilio/twilio-csharp .
Pete

1
@RobertHarvey: o SOAP não é preterido , mas desacreditado : não precisa ser oficialmente não recomendado por quem o criou, para aqueles que sabem o que é recomendável recomendá-lo.
Mason Wheeler

Respostas:


23

SABÃO, DESCANSO E CRIATIVIDADE DAS PESSOAS

O SOAP precisa de um documento de descrição como o WSDL, pois cada recurso pode ser consumido com mensagens diferentes; não há definição no protocolo sobre restrições aos possíveis nomes / mensagens que você pode manipular um recurso.

Por exemplo, no SOAP, seu serviço da web que permite que clientes manipulem um usuário pode expor a operação que cria um usuário em muitas mensagens diferentes, como:

addUser
createUser
insertUser

Obviamente, essas são apenas algumas mensagens de amostra, porque eu vejo muitos nomes engraçados de métodos de serviços da web. Existem pessoas realmente criativas por aí.

Por outro lado, se você estiver expondo seu sistema subjacente usando APIs da Web que realmente respeitem os princípios REST, o cliente só precisará saber que você possui um recurso chamado Usuários, pois há 99% de chance de criar um usuário neste maneira

POST /Users

E isso ocorre para cada operação que você deseja expor usando SOAP ou um API REST da API.

Apesar de ser um protocolo SOAP, que restringe o que você pode ou não fazer, e REST é uma arquitetura de estilo, que deixa muitos pontos em aberto de como fazer as coisas. Existem esforços para definir convenções de como expor e consumir APIs da web REST.


DESCRIÇÃO DE UM REST DA API WEB

No campo de como descrever um web API REST, posso citar o Swagger . Não é uma tentativa de criar um WSDL como o REST da API da Web, mas é uma boa tentativa de criar um padrão aberto para descrever o REST da API da Web.

O Swagger é uma especificação e implementação completa da estrutura para descrever, produzir, consumir e visualizar serviços da Web RESTful.

Eu uso muito o Swagger e realmente o amo, principalmente porque a interface do usuário do Swagger permite gerar um bom console ao vivo e documentação para sua API da web.

Existem muitas implementações do Swagger para a maioria das linguagens: C #, Java, Python, Ruby, etc.

Se você estiver usando a API da Web ASP .NET, existem alguns projetos para gerar automaticamente a especificação Swagger, como Swagger.NET


GERANDO CLIENTES PARA UM RESTO DA API WEB

Como as restrições do REST, como o conjunto limitado de verbos (GET, POST, PUT, DELETE etc.), não são tão difíceis de gerar para a biblioteca de clientes de um API REST da API.

Projetos como o WebApiProxy podem facilmente gerar clientes com C # e Javascript.


CONVENÇÕES PARA RESTO DA API WEB

Para manter nossa vida à medida que os desenvolvedores são mais fáceis, é bom definir algumas convenções de como o REST da API da web se comportará, o melhor esforço que conheço nesse campo é o excelente ebook Apigee - Web Api Design . O e-book não é uma tentativa de criar uma Bíblia ou um mantra sobre como projetar sua API, mas uma coleção de convenções observadas em grandes APIs REST da Web, como Twitter, Facebook, Linkedin, Google, etc.


Por favor inclua WADL, acredito EXATAMENTE o que precisamos para tornar a empresa da API RESTfull / JSON especificada .... embora ainda seja muito mais razoável que o WSDL. O Swagger é ótimo para consumir, gerar um esqueleto, mas fica em um nível mais baixo em minha mente. WADL -> Swagger -> Code Skeleton. O WADL também se encaixa no ecossistema existente, e isso é obrigatório para desenvolvedores corporativos.
JM Becker

3
Estou ... um pouco aturdido, na verdade. Os REST GETsão mais diretos, sim. Mas, sabendo o que verbos são , provavelmente, apoiado não significa que você pode interagir com uma API em tudo . Ainda não temos conhecimento de esquema ou domínio. A resposta real , se estivermos sendo honestos, é que nossas alterações de serviço não quebram explicitamente contratos com integrações quando não há contrato (WSDL) a ser quebrado. E, na web, queremos a liberdade de mudar as coisas à vontade, sem culpa e outros enfeites. Mas, precisamos ler os documentos da API e experimentar * de qualquer maneira ... Então, ficamos bem com isso ...
svidgen

5

Em suma, porque o SOAP foi projetado para ser auto-descritivo: um ponto de extremidade SOAP geralmente inclui uma wsdl que descreve quais operações ele fornece e como os dados são exibidos (por meio de XSDs incorporados) que cada operação recebe e / ou retorna.
Devido a essa auto-descrição, é possível que um aplicativo como o Visual Studio gere um proxy de serviço da web para ele.

Além disso, existem várias extensões do SOAP (as especificações WS- *) que permitem que o comportamento de criptografia ou transacional seja usado com o SOAP. A idéia é que você possa usar o SOAP como um balcão único para criar serviços da web de nível empresarial.

Por outro lado...

O WebAPI foi projetado para fornecer serviços REST. O formato de comunicação para o REST geralmente é JSON ou xml simples - embora isso realmente não importe, pode até ser texto sem formatação. Os serviços REST seguem uma filosofia completamente diferente: eles devem ser leves, para que possam ser facilmente consumidos por scripts do lado do cliente como parte de uma solução AJAX ou por dispositivos móveis.
Como tal, é necessário reduzir ao mínimo o nível da cerimônia, incluindo a auto-descrição. Além disso, mesmo que você queira, a maioria dos formatos de comunicação usados ​​nos serviços REST (como JSON) não tem uma maneira formal de descrever seu conteúdo.

Resumindo, você poderia dizer que os serviços da Web SOAP geralmente são usados ​​para integrar soluções (possivelmente díspares), enquanto os serviços REST são mais adequados para fornecer comunicação entre partes da mesma solução.


1

APIs SOAP / WS- * e RESTful não são iguais. Se você deseja criar APIs de suporte ao SOAP / WS- * WSDL, a ferramenta escolhida na pilha da Microsoft é o WCF, montada com uma opção de ligação HTTP (existem opções de ligação XML e JSON, XML sendo a opção de suporte WSDL).

Na prática, consumir um WSDL de uma linguagem ou plataforma de implementação diferente tem sido problemático. WS- * camadas de segurança por cima ainda mais.

Minha própria experiência tem sido principalmente com .Net, Node, Java e PHP a esse respeito, e posso dizer que, quando você tem plataformas que não precisam definir os detalhes de um tipo filho, ou usará "Object" como o definição, torna-se problemático para dizer o mínimo. Além disso, na maioria das vezes, ninguém realmente entende todo o SOAP / WS- * confiando fortemente nas ferramentas para fazê-lo funcionar. Essa ferramenta possui muitas despesas gerais e sistemas diferentes operam de maneira diferente.

Essas são algumas das razões pelas quais as pessoas tentaram implementar implementações mais simples. Os serviços REST (ala Web API) oferecem terminais em torno de objetos / estado. A ideia é que é mais fácil definir um conjunto de estruturas de objetos mais simples representadas no formato JSON e os pontos de extremidade a serem usados ​​nessas estruturas do que tentar usar o WSDL de um ambiente alienígena que não funcione. contornar o problema.

Ironicamente, esta é uma das áreas que usei Nó em um monte como um serviço de tradução, simplesmente porque era bastante flexível para aceitar implementações sujo como um cliente, e eu poderia escrever clientes simples contra a minha carga adaptada que funcionou melhor. EX: C # obtém texto JSON, que eu uso JSON.Net para converter em uma representação de objeto que eu defini realmente funcionou quando eu não podia usar uma importação WSDL.

Na prática, isso acontece muito.


-3

Embora muitas das respostas aqui sejam ótimas, acho que a resposta é MUITO mais simples: você está olhando a tecnologia errada para o trabalho.

Se você deseja criar um serviço SOAP, deve se ater ao WCF. Ainda é uma estrutura muito poderosa, a Microsoft ainda a está desenvolvendo ativamente, nenhum anúncio foi feito para que pensássemos que isso aconteceria em qualquer lugar no futuro, e foi feito com isso em mente. A API da Web de maneira alguma substitui o WCF (embora seja provavelmente mais moderno que o WCF).

A API da Web costumava fazer parte do WCF, mas foi transferida para a família ASP.NET exatamente porque ela realmente não se encaixava com as outras tecnologias WCF. A API da Web está muito mais preocupada em usar o HTTP como um protocolo de aplicativo do que em um protocolo de transferência. Na API da Web, os verbos HTTP são o rei, no WCF, o HTTP serve apenas para ativar o protocolo SOAP.

Não culpe a API da Web por não dar a capacidade de fazer certas coisas para as quais não foi feita.


3
Isso não responde à pergunta.
Andy
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.