Tive um desafio a poucos dias, que foi consumir Web Services feitos em .Net a partir de um servidor Solaris 10 via processo.
De todas as soluções possíveis que estive a ver, a melhor foi usar
Python.
Encontrei este exemplo:
Python XML HTTP Post to send a SOAP message to a JWSDP or to a .NET web service
Assim fiz o WebServiceGenericClientNet.py:
#!/usr/bin/python
# by eduveks
import sys, httplib, array
try:
host = ""
url = ""
namespace = ""
method = ""
params = {}
for arg in sys.argv[1:]:
if host == "" and arg.find("host=") == 0:
host = arg[len("host="):]
elif url == "" and arg.find("url=") == 0:
url = arg[len("url="):]
elif namespace == "" and arg.find("namespace=") == 0:
namespace = arg[len("namespace="):]
elif method == "" and arg.find("method=") == 0:
method = arg[len("method="):]
elif arg.find("param_") == 0:
params[arg[len("param_"):arg.find("=")]] = arg[arg.find("=") + 1:]
SOAP_Request = ""
SOAP_Request += "<SOAP-ENV:Envelope"
SOAP_Request += " SOAP-ENV:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\""
SOAP_Request += " xmlns:SOAP-ENC=\"http://schemas.xmlsoap.org/soap/encoding/\""
SOAP_Request += " xmlns:xsi=\"http://www.w3.org/1999/XMLSchema-instance\""
SOAP_Request += " xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\""
SOAP_Request += " xmlns:xsd=\"http://www.w3.org/1999/XMLSchema\">"
SOAP_Request += "<SOAP-ENV:Body>"
SOAP_Request += "<"+ method +" xmlns=\""+ namespace +"\">"
for param in params.keys():
SOAP_Request += "<"+ param +">"+ params[param] +"</"+ param +">"
SOAP_Request += "</"+ method +">"
SOAP_Request += "</SOAP-ENV:Body>"
SOAP_Request += "</SOAP-ENV:Envelope>"
http = httplib.HTTP(host)
http.putrequest("POST", url)
http.putheader("Host", host)
http.putheader("User-Agent", "Python")
http.putheader("Content-type", "text/xml; charset=\"UTF-8\"")
http.putheader("Content-length", "%d" % len(SOAP_Request))
http.putheader("SOAPAction", "\""+ namespace + method +"\"")
http.endheaders()
http.send(SOAP_Request)
http_response_statuscode, http_response_statusmessage, http_response_header = http.getreply()
SOAP_Response = http.getfile().read()
if http_response_statuscode == 200 and http_response_statusmessage == "OK":
print SOAP_Response[SOAP_Response.find("<"+ method +"Result>") + len("<"+ method +"Result>"):SOAP_Response.find("</"+ method +"Result>")]
else:
print "### ERROR ###############"
if SOAP_Response.find("<faultstring>") > -1:
print SOAP_Response[SOAP_Response.find("<faultstring>") + len("<faultstring>"):SOAP_Response.find("</faultstring>")]
print "Response: ", http_response_statuscode, http_response_statusmessage
print http_response_header
print SOAP_Response
except:
print "### ERROR ###############"
for err in sys.exc_info():
print err
Para executar o script basta dar permissões de execução e executar:
# chmod +x WebServiceGenericClientNet.py
# ./WebServiceGenericClientNet.py host=localhost url=/HelloWorld.asmx namespace=http://tempuri.org/ method=HelloWorld param_strSay=HelloWorld
O output é:
HelloWorld
Os parâmetros do WebServiceGenericClientNet.py são:
- host: Endereço do servidor
- url: Endereço do webservice
- namespace: Namespace do webservice, que pode ser encontrado vendo o WSDL, http://localhost/HelloWorld.asmx?WSDL
- method: Método do webservice a ser chamado
- param_*NOME_DO_PARAMETRO*: Caso o método precise de parâmetros, podem ser definidos assim, atenção a ordem.
Além de usar este script no Solaris, também acabei por usar este script para chamar web services a partir do .Net/C#, pois são web services que serão atualizados constantemente, com novos métodos e tal, e em vez de ficar atualizando o WSDL basta chamar diretamente com o script a queima-roupa e a configuração da chamada dos web services pode ser feita a partir de configurações em base de dados. Para fazer isto no .Net/C# foi só lançar um processo assim:
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.FileName = "C:\Python26\python.exe";
process.StartInfo.Arguments = "WebServiceGenericClientNet.py host=localhost url=/HelloWorld.asmx namespace=http://tempuri.org/ method=HelloWorld param_strSay=HelloWorld";
process.StartInfo.WorkingDirectory = "C:\Python26\";
process.Start();
string output = process.StandardOutput.ReadToEnd();
Para mais informações e para acompanhar as atualizações deste script:
Script Python para consumir Web Services em .Net
Nenhum comentário foi encontrado.