Acessando um Serviço da Web em JAX-WS a partir do Android

Aprenda a criar um cliente de serviço da Web para um dispositivo Android

Os serviços da Web fornecem serviços específicos para a função e são especialmente adequados para dispositivos remotos. O projeto KSoap2-android é uma biblioteca de SOAP para a plataforma Android. Neste artigo, acessaremos um serviço da Web JAX-WS para o qual um WSDL é fornecido a partir de um cliente do Android. O serviço da Web retorna uma mensagem "Hello" em resposta a uma solicitação que contém um nome. Criaremos um cliente de serviço da Web para o Android usando o plug-in de ADT para Eclipse e a biblioteca KSoap2-android. Testaremos o cliente de serviços da Web em um AVD (Android Virtual Device). A resposta do envio de uma solicitação para um serviço da Web Hello com o nome como argumento de solicitação é apresentada em um emulador de dispositivo virtual do Android.

Visão geral

O artigo contém as seguintes seções:

  1. Pré-requisitos
  2. Criando um serviço da Web em JAX-WS
  3. Instalando o plug-in de ADT do Eclipse & SDK
  4. Criando um projeto Android
  5. Instalando a biblioteca KSoap2-android
  6. Criando o layout
  7. Criando a classe Activity
  8. Configurando a permissão de acesso à Internet
  9. Criando um Android Virtual Device (AVD)
  10. Executando o Android Client para acessar o serviço da Web

Pré-requisitos

Este artigo pressupõe conhecimento prévio dos serviços da Web. Criaremos um serviço da Web simples em JAX-WS que toma um nome como argumento e retorna um cumprimento "Hello". Para desenvolver um serviço da Web, precisaríamos das seguintes estruturas de software:

  1. Eclipse IDE
  2. Um servidor de aplicativos que suporta serviços da Web em JAX-WS. Para obter um tutorial para iniciantes sobre o desenvolvimento de um serviço da Web em JAX-WS com o WebSphere, consulte Recursos.

Para desenvolver um cliente Android para o serviço da Web, precisaríamos dos seguintes componentes de software:

  1. Eclipse IDE
  2. Android SDK
  3. Plug-in de ADT para Eclipse
  4. Biblioteca KSoap2-android

Criando um serviço da Web em JAX-WS

Um serviço da Web em JAX-WS consiste basicamente em uma classe Java comentada com a anotação javax.jws.WebService , o terminal do serviço da Web. Como opção, o serviço da Web pode ser composto por uma interface de terminal em serviço que é implementada pela sua classe. Uma classe de implementação de serviço da Web não pode ser abstract ou final. Os métodos de negócios da classe de implementação que serão expostos como operações para um cliente de serviço da Web devem ser public e não podem ser static ou final. Crie uma classe de implementação de serviços da Web HelloWSImpl, comentada com a anotação @WebService que implementa a interface HelloWS . A classe de implementação contém um método hello que toma um parâmetro String como nome e retorna uma mensagem Hello que contém esse nome. A classe de implementação é apresentada na Listagem 1.

Lista 1. Classe de implementação de serviços da Web HelloWSImpl.java
package hello_webservice;
import javax.jws.*;
@WebService(portName = "HelloWSPort", serviceName = "HelloWSService", 
	targetNamespace = "http://hello_webservice/", 
	endpointInterface = "hello_webservice.HelloWS")
public class HelloWSImpl implements HelloWS {
	public String hello(String name) {
		// replace with your impl here
		 return "Hello "+name +" Welcome to Web Services!";

	}
}

A interface de terminal em serviço HelloWS contém o método hello comentado com a anotação @WebMethod e é apresentado na Listagem 2.

Lista 2. Interface de terminal em serviço HelloWS.java
package hello_webservice;
import javax.jws.WebMethod;
import javax.jws.WebService;
@WebService(name = "HelloWS", targetNamespace = 
	"http://hello_webservice/")
public interface HelloWS {
	@WebMethod(operationName = "hello")
	public String hello(String name);
}

Em seguida, crie um WSDL para o serviço da Web. O serviço da Web deve ser disponibilizado para um cliente Android como WSDL. O WSDL é um documento em formato XML para descrever um serviço da Web como uma coleção de terminais de rede, também chamados de portas. As mensagens são definições abstratas dos dados que estão sendo trocados, e os tipos de porta são uma coleção abstrata de operações. A visualização Design do WSDL para o serviço da Web HelloWSService é mostrada na Figura 1.

Figura 1. Visualização Design do WSDL
Visualização Design do WSDL

O WSDL do serviço da Web é mostrado na Figura 2.

Figura 2. WSDL do serviço da Web
WSDL do serviço da Web

Instalando o plug-in de ADT do Eclipse & SDK

O Android Development Tools (ADT) é um plug-in para o Eclipse IDE que fornece um ambiente integrado para desenvolver aplicativos Android. O Android SDK fornece ferramentas e bibliotecas para desenvolver aplicativos Android. Para instalar o plug-in de ADT, selecione Help>Install New Software... Clique em Add. Em Add Repository, especifique um nome em Name e o local https://dl-ssl.google.com/android/eclipse/ como mostra a Figura 3. Clique em OK.

Figura 3. Criando um repositório para o plug-in de ADT
Criando um repositório para o plug-in de ADT

Selecione Developer Tools da maneira mostrada na Figura 4 e clique em Next.

Figura 4. Instalando Developer Tools
Instalando Developer Tools

Clique em Next em Install Details. Aceite os termos dos contratos de licença e clique em Finish. O plug-in de ADT é instalado. Em seguida, instale o Android SDK. Faça o download do pacote de início do Android (installer_r09-windows.exe para Windows). Clique no instalador para iniciar o Android SDK Tools Setup Wizard. O JDK é necessário para instalar o Android SDK. Caso ainda não possua o JDK 5.0/6.0 instalado, instale-o. Clique em Next. Especifique o local de instalação (C:\Program Files\Android\android-sdk-windows é o padrão) e clique em Next. Escolha uma pasta do menu Iniciar e clique em Install. O Android SDK Tools é instalado como mostra a Figura 5. Clique em Next.

Figura 5. Instalando o Android SDK Tools
Instalando o Android SDK Tools

Clique em Finish. O Android SDK e o AVD Manager são iniciados. Selecione os pacotes que devem ser instalados em Available Packages. Instale os pacotes mostrados na Figura 6.

Figura 6. Android SDK e AVD Manager
Android SDK e AVD Manager

Em seguida, configure as preferências do Android. Selecione Window > Preferences no Eclipse. Em Preferences, selecione o nó do Android. Especifique SDK Location como mostra a Figura 7.

Figura 7. Configurando o local do Android SDK
Configurando o local do Android SDK

Criando um projeto Android

Em seguida, crie um projeto Android no qual criaremos o cliente de serviço da Web para o Android. No Eclipse IDE, selecione File > New. Em New, selecione Android>Android Project como mostrado na Figura 8. Clique em Next.

Figura 8. Novo projeto do Android
Novo projeto do Android

Em New Android Project, especifique o nome do projeto (AndroidWSClient). Em Build Target, selecione Android 2.2. Em Properties, especifique um nome de aplicativo e um nome de pacote. Marque a caixa de seleção Create Activity e especifique a classe Activity (AndroidWSClient). Uma atividade representa uma interação com o usuário, e a classe que estende a classe Activity cria uma janela para uma UI. Especifique a versão mínima do SDK como 8 e clique em Next como mostrado na Figura 9.

Figura 9. Criando um novo projeto Android
Criando um novo projeto Android

Em New Android Test Project, pode-se criar um projeto de teste. Não criaremos um projeto de teste. Clique em Finish. Um projeto de Android é criado, como mostra a Figura 10. O projeto Android se baseia nos seguintes componentes essenciais:

  1. Uma classe de atividade (AndroidWSClient), que estende a classe Activity.
  2. Um arquivo res/layout/main.xml para especificar o layout do aplicativo Android.
  3. O arquivo AndroidManifest.xml , que contém informações essenciais sobre o aplicativo, como o nome do pacote, componentes do aplicativo, processos, permissões e o nível mínimo de API para o sistema Android.
Figura 10. Projeto Android
Projeto Android

Instalando a biblioteca Ksoap2-android

A biblioteca Ksoap2-android é uma biblioteca de SOAP leve e eficiente para a plataforma Android. Faça o download de ksoap2-android-assembly-2.4-jar-with-dependencies.jar a partir do projeto ksoap2-android. Inclua o JAR de montagem Ksoap2-android, que inclui as dependências do Java Build Path, como mostra a Figura 11.

Figura 11. A biblioteca Ksoap2-android
A biblioteca Ksoap2-android

Criando o layout

Em res/layout/main.xml , especifique o layout dos componentes de UI do Android. Criaremos uma UI em que a resposta do serviço da Web é exibida como uma mensagem de texto. Crie um LinearLayout em que os subelementos são exibidos em um layout linear de forma vertical. Inclua um elemento TextView , com resultado de ID, para exibir a resposta do serviço da Web para uma chamada de método referente a hello . A chamada de método envia um nome como argumento e obtém uma mensagem "Hello" como resposta. Como opção, é possível criar um elemento TextView para um título. O layout gráfico do aplicativo cliente de serviço da Web do Android é mostrado na Figura 12. A tela do Android fica praticamente vazia com uma disposição para exibir uma resposta de serviço da Web como mensagem de texto.

Figura 12. O Layout Gráfico
O Layout Gráfico

O arquivo de layout main.xml é apresentado na Listagem 3.

Lista 3. Arquivo de layout main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<TextView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:text="" />
	<TextView android:id="@+id/result" android:layout_width="fill_parent"
		android:layout_height="wrap_content" />
</LinearLayout>

Criando a classe Activity

A classe AndroidWSClient é a classe de atividade de um aplicativo Android e estende a classe Activity . Nesta seção, iremos desenvolver a classe activity AndroidWSClient . Importe as classes necessárias de Ksoap2-android:

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.PropertyInfo;

Defina as constantes explicadas na Tabela 1.

Tablela 1. Constantes na classe Activity
ConstanteDescrição
NAMESPACENamespace é o targetNamespace no WSDL.
URLA URL do WSDL. Seu valor é o atributo location do elemento soap:address referente a um elemento port em um WSDL. A não ser que o serviço da Web também esteja hospedado no dispositivo Android, o nome do host não deve ser especificado como localhost, porque o aplicativo executa no dispositivo Android, enquanto o serviço da Web está hospedado no servidor localhost . Especifique o nome de host como o endereço IP do servidor que hospeda o serviço da Web.
METHOD_NAMENome da operação do serviço da Web, que pode ser obtido a partir do WSDL.
SOAP_ACTIONNAMESPACE+METHOD_NAME especificado com um literal de cadeia de caractere.

Os valores de constante são apresentados a seguir, o endereço IP da constante da URL varia:

private static final String NAMESPACE = "http://hello_webservice/";
private static String URL="http://192.168.1.68:7001/HelloWebService/HelloWSService?WSDL"; 
private static final String METHOD_NAME = "hello";
private static final String SOAP_ACTION =  "http://hello_webservice/hello";

Todas as atividades devem implementar o método onCreate para a inicialização das atividades. Defina a UI usando o método setContentView e o recurso de layout.

setContentView(R.layout.main);

Crie um objeto TextView de widget Android usando o método findViewById no elemento TextView definido em main.xml.

TextView lblResult = (TextView) findViewById(R.id.result);

Crie um objeto org.ksoap2.serialization.SoapObject para desenvolver uma solicitação de SOAP. Especifique o namespace do objeto SOAP e o nome de método que deve ser chamado no construtor SoapObject .

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

Crie um objeto org.ksoap2.serialization.PropertyInfo para conter as informações de propriedade que devem ser enviadas com a chamada de método SOAP. Cada propriedade requer um novo objeto PropertyInfo . O método hello toma apenas um argumento como nome. Defina o nome de propriedade como "arg0" e especifique o tipo como STRING_CLASS. Inclua o objeto PropertyInfo no SoapObject usando o método addProperty .

PropertyInfo propInfo=new PropertyInfo();
propInfo.name="arg0";
propInfo.type=PropertyInfo.STRING_CLASS;
request.addProperty(propInfo, "John Smith");

Em seguida, crie um envelope de SOAP. Use a classe SoapSerializationEnvelope , que estende a classe SoapEnvelop , com suporte para o formato SOAP Serialization, que representa a estrutura de uma mensagem SOAP serializado. A principal vantagem de serialização do SOAP é a portabilidade.

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

A constante SoapEnvelope.VER11 indica o SOAP versão 1.1. Designe o objeto de solicitação SoapObject para o envelope como a mensagem de saída referente à chamada de método de SOAP.

envelope.setOutputSoapObject(request);

Crie um objeto org.ksoap2.transport.HttpTransportSE que representa uma camada HttpTransport baseada em J2SE. HttpTransportSE estende a classe org.ksoap2.transport.Transport , que resume a serialização e desserialização das mensagens SOAP.

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

Faça a chamada de SOAP usando SOAP_ACTION e o envelope de SOAP.

androidHttpTransport.call(SOAP_ACTION, envelope);

Obtenha a resposta do serviço da Web usando o método getResponse do objeto SoapSerializationEnvelope e converta o objeto de resposta para SoapPrimitive. Essa é a classe usada para resumir tipos primitivos.

SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();

Defina a mensagem de cadeia de caractere na resposta de SOAP no componente de UI TextView .

lblResult.setText(resultsRequestSOAP.toString());

A classe Activity é apresentada abaixo na Listagem 4.

Lista 4. Activity Class AndroidWSClient.java
package android.webservice.client;


import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.serialization.PropertyInfo;


import android.widget.TextView;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;


public class AndroidWSClient extends Activity {

 
 private static final String NAMESPACE = "http://hello_webservice/";
 private static String URL = "http://192.168.1.68:7001/HelloWebService/
	HelloWSService?WSDL"; 
 private static final String METHOD_NAME = "hello";
 private static final String SOAP_ACTION =  "http://hello_webservice/hello";
 
 private TextView lblResult;
 

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  lblResult = (TextView) findViewById(R.id.result);
 
  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

  
  PropertyInfo propInfo=new PropertyInfo();
  propInfo.name="arg0";
  propInfo.type=PropertyInfo.STRING_CLASS;
  
  request.addProperty(propInfo, "John Smith");  

  SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 

  envelope.setOutputSoapObject(request);
 HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

  try {
   androidHttpTransport.call(SOAP_ACTION, envelope);
  
    SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
  

   lblResult.setText(resultsRequestSOAP.toString());
   
 
  } catch (Exception e) {
	  
   
  }

 }
}

Configurando a permissão de acesso à Internet

Para acessar um serviço da Web a partir de um dispositivo Android, precisamos ativar uma permissão em AndroidManifest.xml que permita que os aplicativos abram soquetes de rede. Inclua o seguinte elemento uses-permission .

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

O AndroidManifest.xml com a permissão definida é mostrado na Figura 13.

Figura 13. Definindo a permissão INTERNET
Definindo a permissão INTERNET

O AndroidManifest.xml é apresentado na Listagem 5.

Lista 5. AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="android.webservice.client"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AndroidWSClient"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-sdk android:minSdkVersion="8" />

</manifest>
</uses-permission>

Criando um AVD

O Android SDK fornece um emulador de dispositivo remoto, um dispositivo remoto virtual para desenvolver e testar aplicativos de Android. O emulador suporta configurações do Android Virtual Device (AVD) com as quais outras opções de dispositivo remoto virtual, como a plataforma Android, podem ser especificadas. Para criar um AVD, clique em Window>Android SDK e AVD Manager. Clique em Virtual devices e em New, como mostra a Figura 14.

Figura 14. Criando um AVD
Criando um AVD

Em Create New AVD, especifique um nome em Name e selecione Target como Android 2.2-API level 8. Especifique SD Card size como 100 MiB. Deve ser suficiente para instalar o aplicativo de cliente da Web. A especificação de um valor mais baixo, como 10, pode gerar o erro "No space left on device". Clique em Create AVD para criar um AVD, como mostra a Figura 15.

Figura 15. Configurando o AVD
Configurando o AVD

Um novo AVD é criado como mostra a Figura 16.

Figura 16. Novo AVD
Novo AVD

Executando o cliente do Android para acessar o serviço da Web

O emulador de Android fornece várias opções de customização. Por exemplo, para escalar o emulador, especifique o valor scale com a seguinte opção:

-scale <value>

Para especificar uma opção de emulador, clique com o botão direito no aplicativo AndroidWSClient e selecione Run As..>Run Configurations. Selecione o aplicativo AndroidWSClient e especifique a opção -scale no campo Additional Emulator Command Line Options e clique em Apply, como mostra a Figura 17.

Figura 17. Definindo a opção de escala do emulador
Definindo a opção de escala do emulador

Para instalar e executar o aplicativo AndroidWSClient no emulador, clique com o botão direito em AndroidWSClient e selecione Run As..>Android Application, como mostra a Figura 18.

Figura 18. Executando o aplicativo Android
Executando o aplicativo Android

O aplicativo AndroidWSClient é instalado no AVD como mostra a Figura 19. Clique no aplicativo para executar o cliente de serviço da Web no AVD.

Figura 19. Cliente de serviço da Web de Android instalado
Cliente de serviço da Web de Android instalado

O serviço da Web é chamado e a resposta do serviço da Web é exibida no emulador de Android, como mostrado na Figura 20.

Figura 20. Acessando o serviço da Web
Acessando o serviço da Web

A saída da execução do aplicativo Android é mostrada na Listagem 6.

Lista 6. Saída do aplicativo Android
 AndroidWSClient] Android Launch!
 AndroidWSClient] adb is running normally.
 AndroidWSClient] Performing android.webservice.client.AndroidWSClient activity launch
 AndroidWSClient] Automatic Target Mode: launching new emulator with compatible AVD 
	'AndroidAVD'
 AndroidWSClient] Launching a new emulator with Virtual Device 'AndroidAVD'
 AndroidWSClient] New emulator found: emulator-5554
 AndroidWSClient] Waiting for HOME ('android.process.acore') to be launched...
 AndroidWSClient] HOME is up on device 'emulator-5554'
 AndroidWSClient] Uploading AndroidWSClient.apk onto device 'emulator-5554'
 AndroidWSClient] Installing AndroidWSClient.apk...
 AndroidWSClient] Success!
 AndroidWSClient] Starting activity android.webservice.client.AndroidWSClient on device 
	emulator-5554
 AndroidWSClient] ActivityManager: Starting: Intent { act=android.intent.action.MAIN
 cat=[android.intent.category.LAUNCHER] 
 cmp=android.webservice.client/.AndroidWSClient }

Quando o aplicativo Android é executado, as seguintes tarefas são realizadas:

  1. Um novo emulador é ativado
  2. O AndroidWSClient.apk é transferido por upload para o emulador
  3. O AndroidWSClient.apk é instalado
  4. A atividade android.webservice.client.AndroidWSClient é iniciada

Recursos

Aprender

Obter produtos e tecnologias

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=WebSphere
ArticleID=697155
ArticleTitle=Acessando um Serviço da Web em JAX-WS a partir do Android
publish-date=07012011