Web Service

Pessoal, boa tarde!

Sou novo no mundo JAVA, bem como de Web Services.

Por isso estou realiando uma tarefa na qual sera presciso informar uma numeracao de (cid) de determinadas maquinas (cid), os nomes das maquinas e taambem a sua identificacao.

Foi criado a classe abaixo:

[code]public class WSMachines {

public String getMachines (String cid)
{
	String machineId = "";
	Connection con = null;
	
	try
	{
		con = DatabaseProvider.getAsset();
		java.util.Vector vMachines = MachineId.recuperaTodasPeloCid(con, cid);
		
	}
	catch (Exception e)
	{
		e.printStackTrace();
	}
	finally
	{
		DatabaseProvider.returnAsset(con);
	}
	return cid;
	
}


public String toxml (java.util.Vector<MachineId> WSMachines) throws Exception
{
	String xml = "<cid>";
	if (WSMachines != null)
		{
			for (int i = 0; 1 &lt WSMachines.size(); i++)
				{
					MachineId machineId = WSMachines.get(i);
						xml = "<machine>";
						xml = "<mid>" + machineId.getMachineId() + "</mid>";
						xml = "<name>" + machineId.getMachineHostName() + "</name>";
						xml = "</machine>";
				}
		}


xml = "</cid>";

return xml;
}

}[/code]

E o web service:

[code]<%@page import=“org.apache.axis.client.Call”%>
<%@page import=“org.apache.axis.client.Service”%>
<%@page import=“java.io."%>
<%@page import="java.util.
”%>

<%

String cid = request.getParameter("machineId");

String urlWS = "http://localhost:8080/axis/WSMachines.jws";

String[] machineId = new String[] (machineId);

Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAdress(urlWS);
call.setOperationName ("getMachineId");
String ret = (String) call.invoke(machineId);
out.println("RESULTADO:  " + ret);

%>[/code]

O codigo gera um erro na linha: String[] machineId = new String[] (machineId);

E nao sei com tratar.

O erro e o seguinte: "Syntaxe erro on Token, “]”, AssignmentOperator expected after this token. Como tratar este erro?

String[] machineId = new String[] {cid};

Muito obrigado Daniel, mas agora o erro foi para algumas linhas abaixo:

call.setTargetEndpointAdress(urlWS);

e o erro e: The method setTargetEndpointAdress(String)is undefined for the type call.

Ele diz que o objeto call não tem esse método ai.
Cara, porque você não usa WebServices do JEE5 ou então o Apache Axis, ou o XFire, em vez de fazer na mão usando o JWSDP?

Porque sou iniciante em JAVA, WEB SERVICE e desconheco tais ferramentas/programas. Com isso fica mais facil?

O compilador não perdoa erros de ortografia. Veja no dicionário de Inglês quantas letras D tem a palavra “endereço”.

De qualquer maneira, tente não usar DII (Dynamic Invocation Interface), além de ser difícil de usar, é mais lento e sujeito a esse tipo de problemas. Use alguma outra forma de invocar web services que não envolva tanto código escrito por você.
Se o web service tiver uma descrição WSDL, então fica super-fácil de invocá-lo.

hahahaha… bem visto, thingol.

Cosme, olhe os tutoriais sobre Axis aqui no GUJ ou procure no Google por Axis, XFire, ou a annotation @WebService do JEE5.

Entrei em um tutorial DevMedia, e seu?

Não que eu saiba.

www.devmedia.com.br/visualizacomponente.aspx?comp=2078

Eu sou o Daniel Destro… o DQO, autor deste artigo, também faz parte do GUJ.

Muito obrigado, thingol! Prestarei mais atencao da proxima vez.

Entendi, vcs sao fera! Sera que terei dificuldades sem nenhuma experiencia em JAVA, WEB SERVICES com estas ferramentas/programas?

Tente e verá.

Ainda sobre o WS de ontem, agora nao sei como fazer para “printar” as informacoes em xml. Vcs poderiam de explicar como? Nao precisa nem fazer…

Segue as linhas de comando:

[code]import automatos.site.util.DatabaseProvider;
import automatos.site.desktop.MachineId;
import java.sql.Connection;

public class WSMachines {

public String getMachines (String cid) {
	String machineId = "";
	Connection con = null;
	
	try {
		con = DatabaseProvider.getAsset();
		java.util.Vector vMachines = MachineId.recuperaTodasPeloCid(con, cid);
		
	}
	catch (Exception e)
	{
		e.printStackTrace();
	}
	finally
	{
		DatabaseProvider.returnAsset(con);
	}
	return cid;
	
}

public String toxml (java.util.Vector<MachineId> WSMachines) throws Exception
{
	String xml = "<cid>";
	if (WSMachines != null)
		{
			for (int i = 0; 1 &lt WSMachines.size(); i++)
				{
					MachineId machineId = WSMachines.get(i);
						xml = "<machine>";
						xml = "<mid>" + machineId.getMachineId() + "</mid>";
						xml = "<name>" + machineId.getMachineHostName() + "</name>";
						xml = "</machine>";
				}
		}

xml = "</cid>";

return xml;
}

}[/code]

e o client:

[code]<%@page import=“org.apache.axis.client.Call”%>
<%@page import=“org.apache.axis.client.Service”%>
<%@page import=“java.io."%>
<%@page import="java.util.
”%>

<%

//String xml = request.getparameter("xml");
String cid = request.getParameter("cid");

String urlWS = "http://localhost:8080/axis/WSMachines.jws";

String[] arrayCid = new String[] {cid};

//String[] xml = new String[] ();

Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(urlWS);
call.setOperationName ("getMachines");
String ret = (String) call.invoke(arrayCid);
out.println("CID:  " + ret);
call.setOperationName ("toxml");

out.println(""); 

%>[/code]

Cara, segue nossas dicas… ou use o JWSDP para fazer isso, ou trabalhe menos usando @WebServices do JEE-5 ou então Apache Axis ou XFire.

O padrão SOAP (xml) é muito complicado para humanos.

Daniel e que este e o ultimo trabalho neste projeto e a partir do proximo seguirei as suas dicas. Eu so gostaria de entender a logica de “printar” um referido metodo. Obrigado.

Cara, não é bem assim.
Como você está recebendo a requisição SOAP? Via Servlet que você fez, ou com auxílio de uma ferramenta própria para isso?