// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Introdução aos Web Services
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Introdução aos Web Services - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Introdução aos Web Services

Este documento fornece uma visão geral dos conceitos e tecnologias de Web service suportados pelo NetBeans IDE. Ele se destina a ajudar os iniciantes em Web services, antes de eles usarem quaisquer tutoriais.

Os Web services são componentes de aplicação distribuídos que estão disponíveis externamente. Você pode usá-los para integrar aplicações de computador que são escritas em linguagens diferentes e executadas em plataformas diferentes. Os Web services são independentes de linguagem e de plataforma porque os fornecedores concordaram em oferecer padrões de Web service comuns.

A Oracle está desenvolvendo um projeto java.net chamado Metro. O Metro é uma pilha de Web services completa, que cobre todas as necessidades de um desenvolvedor de simples demonstrações "Hello, World!" a Web services confiáveis, seguros e transacionados. Para obter mais informações, consulte link:https://metro.java.net/[+a home page do Metro+].

O Metro inclui o Web Services Interoperability Technologies (WSIT). O WSIT dá suporte a funcionalidades corporativas, como segurança, confiabilidade e otimização de mensagem. O WSIT garante que os serviços Metro com essas funcionalidades sejam interoperáveis com os serviços Microsoft .NET. No Metro, o Project Tango desenvolve e aprimora a base de código do WSIT. Para ver como o WSIT funciona, use o tutorial link:wsit.html[+Interoperabilidade Avançada de Web Service+].

Vários modelos de programação estão disponíveis para desenvolvedores de Web services. Esses modelos estão em duas categorias, as duas suportadas pelo IDE:

* *Baseado em REST.* *RE*presentational *S*tate *T*ransfer é uma nova forma de criar e se comunicar com Web services. No REST, os recursos têm URIs e são manipulados por operações do cabeçalho HTTP. Para obter mais informações, consulte <<rest,Web Services RESTful>>.
* *Baseado em SOAP/WSDL.* Em modelos tradicionais de Web services, as interfaces de Web services são expostas em documentos WSDL (um tipo de XML), que têm URLs. A troca de mensagens subseqüente é em SOAP, outro tipo de documento XML. Para obter mais detalhes, consulte <<jaxws,Web Services baseados em SOAP>>.


== Web Services RESTful

Os Web services baseados em REST ("RESTful") são coleções de recursos web identificados por URIs. Todos os documentos e processos são modelados como um recurso web com um URI único. Esses recursos web são manipulados pelas ações que podem ser especificadas em um cabeçalho HTTP. Não são usados padrões SOAP, nem WSDL, nem WS-*. Em vez disso, a troca de mensagens pode ser conduzida em qualquer formato — XML, JSON, HTML etc. Em muitos casos, um Web browser pode servir como cliente.

HTTP é o protocolo em REST. Apenas quatro métodos estão disponíveis: GET, PUT, POST e DELETE. As solicitações podem ser marcadas e as respostas podem ser armazenadas no cache. Um administrador de rede pode facilmente acompanhar o que está acontecendo com o serviço RESTful, apenas observando os cabeçalhos HTTP.

REST é uma tecnologia adequada para aplicações que não requerem segurança além da que está disponível na infraestrutura HTTP e em que o HTTP é o protocolo apropriado. Os serviços REST ainda podem oferecer funcionalidade sofisticada. Flickr, Google Maps e Amazon fornecem Web services RESTful. A funcionalidade Software como um Serviço (SaaS) do NetBeans IDE permite usar o Facebook, o Zillow e outros serviços fornecidos por terceiros em suas próprias aplicações.

link:https://jersey.java.net/[+Projeto Jersey+] é a implementação de referência de código-fonte aberto para construir Web services RESTful. As APIs Jersey estão disponíveis como o plug-in "Web Services RESTful" para NetBeans IDE.

Os tutoriais a seguir envolvem a criação e o consumo de serviços REST:

* link:../../docs/websvc/rest.html[+Introdução ao RESTful Web Services+]
* link:../../docs/websvc/zillow.html[+SaaS: Zillow+]


==  Web Services baseados em SOAP

Em Web services baseados em SOAP, os utilitários Java criam um arquivo WSDL baseado no código Java no Web service. O WSDL é exposto na rede. As partes interessadas em usar o Web service criam um cliente Java baseado no WSDL. As mensagens são trocadas no formato SOAP. A série de operações que podem ser passadas em SOAP é muito mais ampla do que a que está disponível em REST, especialmente em termos de segurança.

Os Web services baseados em SOAP são adequados para aplicações pesadas que usam operações complicadas e para aplicações que requerem segurança sofisticada, confiabilidade ou outras funcionalidades suportadas pelos padrões WS-*. Eles também são adequados quando um protocolo de transporte diferente de HTTP tem que ser usado. Muitos dos Web services da Amazon, particularmente aqueles que envolvem transações comerciais, e os Web services usados por bancos e agências governamentais são baseados em SOAP.

A API Java para Web Services XML (JAX-WS) é o modelo atual para Web services baseados em SOAP no Metro. O JAX-WS é incorporado no modelo anterior JAX-RPC, mas usa funcionalidades específicas do Java EE, como anotações, para simplificar a tarefa de desenvolver Web services. Como usa SOAP para mensagem, o JAX-WS é de transporte neutro. Ele também oferece suporte a uma ampla gama de especificações WS-* modulares, como WS-Security e WS-ReliableMessaging.

Quando cria um cliente de Web service, você tem a opção de usar o modelo JAX-WS ou JAX-RPC. Isso acontece porque alguns serviços JAX-RPC mais antigos usam um estilo de vinculação que não é suportado pelo JAX-WS. Esses serviços só podem ser consumidos pelos clientes JAX-RPC.

Os tutoriais a seguir envolvem a criação e o consumo de Web services JAX-WS baseados em SOAP:

* link:./jax-ws.html[+Introdução aos Web Services JAX-WS+]
* link:./client.html[+Desenvolvendo Clientes de Web Service JAX-WS+]
* link:./flower_overview.html[+Web Service Passando Dados Binários+] - uma trilha do aprendizado separada sobre o uso de Web services para passar dados binários que são exibidos em um cliente que usa componentes Swing
* link:./wsit.html[+Interoperabilidade Avançada de Web Service+] (demonstra WSIT)
