Italian Invocara Web Servivce SOAP

gdelvecchio

Member
Licensed User
Longtime User
Ciao a tutti

questa mattina ho iniziato a cimentarmi con la chiamata di un web service da B4A.

Questa è la struttura del mio web service:
B4X:
<definitions targetNamespace="http://ibbs_f_x0ws_sincro_device.ws.localhost/" name="SitepainterSOAPController"><types><xsd:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://ibbs_f_x0ws_sincro_device.ws.localhost/"><xsd:element name="ibbs_f_x0ws_sincro_device_Run"><xsd:complexType><xsd:sequence><xsd:element name="m_UserName" type="xsd:string" minOccurs="1" maxOccurs="1"/><xsd:element name="m_Password" type="xsd:string" minOccurs="1" maxOccurs="1"/><xsd:element name="m_Company" type="xsd:string" minOccurs="1" maxOccurs="1"/><xsd:element name="p_XML" type="xsd:string" minOccurs="1" maxOccurs="1"/></xsd:sequence></xsd:complexType></xsd:element><xsd:element name="ibbs_f_x0ws_sincro_device_RunResponse"><xsd:complexType><xsd:sequence><xsd:element name="return" type="xsd:string" minOccurs="0"/></xsd:sequence></xsd:complexType></xsd:element></xsd:schema></types><message name="ibbs_f_x0ws_sincro_device_Run"><part name="parameters" element="tns:ibbs_f_x0ws_sincro_device_Run"/></message><message name="ibbs_f_x0ws_sincro_device_RunResponse"><part name="parameters" element="tns:ibbs_f_x0ws_sincro_device_RunResponse"/></message><portType name="ibbs_f_x0ws_sincro_deviceWS"><operation name="ibbs_f_x0ws_sincro_device_Run"><input name="ibbs_f_x0ws_sincro_device_Run" message="tns:ibbs_f_x0ws_sincro_device_Run"/><output name="ibbs_f_x0ws_sincro_device_RunResponse" message="tns:ibbs_f_x0ws_sincro_device_RunResponse"/></operation></portType><binding name="ibbs_f_x0ws_sincro_deviceWSPortBinding" type="tns:ibbs_f_x0ws_sincro_deviceWS"><soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/><operation name="ibbs_f_x0ws_sincro_device_Run"><soap:operation soapAction=""/><input name="ibbs_f_x0ws_sincro_device_Run"><soap:body use="literal"/></input><output name="ibbs_f_x0ws_sincro_device_RunResponse"><soap:body use="literal"/></output></operation></binding><service name="ibbs_f_x0ws_sincro_deviceWSService"><port name="ibbs_f_x0ws_sincro_deviceWSPort" binding="tns:ibbs_f_x0ws_sincro_deviceWSPortBinding"><soap:address location="http://192.168.9.171:8080/INDIAF23/servlet/ibbs_f_x0ws_sincro_device"/></port></service></definitions>

Come vedete lui vuole 4 parametri e mi deve tornare OK oppure KO in base a quello che gli passo nel parametro xml.

Ora creare la stringa xml non è un problema, ma non riesco a invocare il web service.

Utilizzo la HttpUtils2 e questo è il codice che stò provando a implementare:

B4X:
Sub WS_invoke_syncro_device(user As String, pass As String, azienda As String, xml As String)
   
   Dim job1, job2, job3 As HttpJob
    job1.Initialize("Job1", Me)
    
    'Send a GET request
    job1.Download2("http://192.168.9.171:8080/INDIAF23/servlet/ibbs_f_x0ws_sincro_device?wsdl", _
        Array As String("m_UserName", user, "m_Password", pass, "m_Company", azienda, "p_XML", xml))
   
   
   'Send a POST request
'   job2.Initialize("Job2", Me)   
'   job2.PostString("http://mioserver/servlet/ibbs_f_x0ws_sincro_device?wsdl", _
'       "m_UserName=" & user & "m_Password="& pass & "m_Company="& azienda & "p_XML="& xml)
'   
End Sub

Sub JobDone (Job As HttpJob)
   Log("JobName = " & Job.JobName & ", Success = " & Job.Success)
    If Job.Success = True Then
        Select Job.JobName
            Case "Job1", "Job2"
            'print the result to the logs
                Log(Job.GetString2("UTF8"))
            Log(Job.Username)
            Log(Job.Password)
            Log(Job.)
        End Select
    Else
        Log("Error: " & Job.ErrorMessage)
        ToastMessageShow("Error: " & Job.ErrorMessage, True)
    End If
    Job.Release
End Sub


Chiamando così il WS mi da questo return:
JobName = Job1, Success = true
<html>
<script>
window.open("../index.htm",'_top')
</script>
</html>

Quindi lui prova ad aprire una pagina.
Perchè ????

Perchè non mi torna il return OK oppure KO???
:BangHead::BangHead::BangHead:

E' corretto chiamare il link al WSDL?????

Grazie a tutti per l'aiuto
 

gdelvecchio

Member
Licensed User
Longtime User
Risolto!!!

Ho risolto da solo!!

Se a qualcuno serve invocare un web service SOAP chidetelo e sarete esauditi!

Vi posso dire che non è stato facile per niente!!!!

Ciao a tutti!


:sign0098::sign0098::sign0098::sign0098:

me lo dico da solo!!!

:icon_clap::icon_clap::icon_clap::icon_clap:
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Magico :sign0098:
Se vuoi nel mio sito
Puoi registrarti, e sarai autore, così da inserire nuovi esempi utili a tutti gli sviluppatori B4A.
Altrimenti posta il codice e l'esempio lo metto io, mettendo il tuo nome.:sign0098:
 

simone69android

Member
Licensed User
Longtime User
Nessuno che posta il codice di esempio

Qualcuno può postare il codice, o quakche link..
Grazie

:BangHead:
 

gdelvecchio

Member
Licensed User
Longtime User
Ecco il codice! Scusate il ritardo!

Ciao a tutti

scusate il ritardo ma sto facendo questa mega app con B4A e altre mille cose quindi sono sempre presissimo e qunado riesco vengo nel forum.

Vi spiego il tutto per invocare web service SOAP con B4A:

Innanzi tutto si deve utilizzare il software SOAPUI per convalidare il codice xml soap envelope da inviare al WS(WEB SERVICE).

Dopo aver indicate il wsdl a SOAPUI lui vi ritirna l'xml corretto.
E' veramente facile non mi dilungo ulteriormente.

Di seguito il codice B4A:
B4X:
Sub WS_Invoke(device As String, flsync As String)
   ' URL
   Dim endPoint As String
    Dim requestSoapXML As String
    endPoint = WS_URL
   
    ' dichiarazione variabili e tag cdata
    Dim user, password, azienda, pxml As String
    Dim CDATA_OPEN As String
   CDATA_OPEN = "<![CDATA["
   Dim CDATA_CLOSE As String
   CDATA_CLOSE = "]]>"
   Dim xml_build As String
   
   
   ' build xml
   Dim x As XMLBuilder
   x = x.create("XML_DEVICE")
   x = x.element("DEVICE").attribute("ID_DEV", device).attribute("FLSYNC", flsync) _
        .up() _
    .up()
   Log(x.asString)
   xml_build = x.asString
   
   
   
   'parametri
    user = "valore.."
    password = "valore.."
   azienda = "valore.."
   pxml = CDATA_OPEN & xml_build & CDATA_CLOSE
   
   Log(pxml)
   
   'RICHIESTA SOAP
    requestSoapXML = _
         "<?xml version='1.0' encoding='utf-8'?>" & _ 
         "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' xmlns:ibbs='http://ibbs_f_x0ws_sincro_device.ws.localhost/'>" & _
                  "<soapenv:Header/>" & _
                  "<soapenv:Body>" & _
                  "<ibbs:ibbs_f_x0ws_sincro_device_Run>" & _
                  "<ibbs:m_UserName>"&user&"</ibbs:m_UserName>" & _
                  "<ibbs:m_Password>"&password&"</ibbs:m_Password>" & _
                  "<ibbs:m_Company>"&azienda&"</ibbs:m_Company>" & _
                  "<ibbs:p_XML>"&pxml&"</ibbs:p_XML>" & _
                 "</ibbs:ibbs_f_x0ws_sincro_device_Run>" & _
               "</soapenv:Body>" & _
         "</soapenv:Envelope>"
         
    Log(requestSoapXML)
   
    ' richiesta al ws
   webRequest.InitializePost2(endPoint, requestSoapXML.GetBytes("UTF-8"))
   'webRequest.InitializePost(endPoint, requestSoapXML, 1)
   webRequest.SetHeader("Content-Type", "text/xml; charset=utf-8")
   webRequest.SetHeader("SOAPAction", "")
   
   ' imposto il timer che permette la completa esecuzione del WS
    webRequest.Timeout = 60000 
   
   webClient.Initialize("webClient")
    If webClient.Execute(webRequest, 1) = False Then Return
   
End Sub

Sub webClient_ResponseSuccess (Response As HttpResponse, TaskId As Int)
    
   Dim resultSoapXML As String
    resultSoapXML = Response.GetString("UTF8")
    Log("Success : " & resultSoapXML)   
   
End Sub

Sub webClient_ResponseError (Response As HttpResponse, Reason As String, StatusCode As Int, TaskId As Int)
    
   Dim resultSoapXML As String
    resultSoapXML = Response.GetString("UTF8")
    Log("Error : " & resultSoapXML)
    Log("Reason: " & Reason)
    Log("StatusCode: " & StatusCode)
End Sub

Come potete vedere il mio WS richiede 4 parametri che gli passo nella richiesta SOAP.

Con la libreria "xml builder" buildo l'xml, in questo esempio è una riga singola logicamente se ci attacate un cursore fate quello che volete.

Mi raccomando l'xml che passate con il soap envelope deve essere sempre all'interno del tag CDATA altrimenti il parsing della stringa non funziona.

E SOPRATTUTTO ATTENTI AL TIMER DEL WEBCLIENT!!!!

Se impostate il timer troppo basso rischiate di dare il tempo al vostro WSi eseguire i suoi metodi.(come ho fatto io fino a quando mi è venuto il lampazzo di geno:icon_clap::icon_clap::icon_clap.

Spero di essere stato chiaro, cmq il codice parla da solo!!!

Ciao a tutti

 

gdelvecchio

Member
Licensed User
Longtime User
link soapui!

Scusate!

Vi posto il link al progetto soapui!!

soapUI - The Home of Functional Testing

Veramente importante e utile!!
Direi fondamentale!!:icon_clap::icon_clap::icon_clap:

Dimenticavo di dirvi che questo metodo funziona con qualsiasi WS SOAP che sia fatto in asp.net o altri framework.

Io l'ho testato con asp.net e un framework minore...

Ciao a tutti e grande B4A!!!!!!!

 
Cookies are required to use this site. You must accept them to continue using the site. Learn more…