Vai al contenuto

Web Services


Messaggi raccomandati

Salve a tutti devo modificare un'applicazione per farla interagire con un webservices windows che espone il wsdl.

Girando sui vari forum non ho trovato molto, ho solo identificato in WSMakeStubs un tool command-line che permette, accedendo al WSDL, la creazione di 2 classi (.h e .m) da importare all'interno della propria applicazione. I problemi iniziano qui, infatti inserendo le classi nell'applicazione e compilando vengono generati errori legati al CoreServices.framework che non ho risolto.

Qualcuno potrebbe darmi una mano.

Grazie

L'Uomo in Nero fuggì nel deserto, ed il pistolero lo seguì....

MacBook Pro 15' 2009 - 8 GB RAM / iMac 2011 21,5 - 2,7 GHz - 12 GB RAM / iPod Touch 4th generazione / iPod nano 3th generazione / iPad 1th generazione 32GB

Link al commento
Condividi su altri siti

ma questa cosa che dici tu è ferma dal 2004 o sbaglio? se è così non mi meraviglierei di ricevere degli errori.

mi fai capire meglio cosa sarebbe? in pratica questo WSMakeStubs dovrebbe parsare il file xml fornito dal wsdl e creare automaticamente delle classi che è possibile importare all'interno del proprio codice?

Problemi a programmare il tuo iphone? contattami

Link al commento
Condividi su altri siti

Si, hai descritto esattamente il comportamento del tool.

Purtroppo al momento della compilazione mi da errori su include presenti nei file .h che crea, che fanno riferimento al framework coreservices, di seguito una parte dell'errore che presenta

La compilazione ritorna il seguente errore:

Expected declaration specifiers or '....' before 'CFXMLTreeRef'

segnalando l'errore sui seguenti file

/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/WebServicesCore.framework/Headers/WSMethodInvocation.h:759:0 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.2.sdk/System/Library/Frameworks/CoreServices.framework/Frameworks/WebServicesCore.framework/Headers/WSMethodInvocation.h:759: error: expected declaration specifiers or '...' before 'CFXMLTreeRef'

La riga indicata contiene la seguente dichiarazione

typedef CALLBACK_API( CFTypeRef , WSMethodInvocationDeserializationProcPtr )(WSMethodInvocationRef invocation, CFXMLTreeRef msgRoot, CFXMLTreeRef deserializeRoot, void *info);

Sono anche poco pratico di wsdl e webservices, ma nei file che crea viene fedelmente riportato il contenuto del wsdl. Purtroppo lato application server mi hanno detto che risponde con un xml, ma che la richiesta non avviene con un richiesta standard (link internet con xml associato) ma invocando metodi dei webservices che sono descritti nel wsdl. Spero sia stato chiaro.

In ogni caso grazie per l'interessamento

L'Uomo in Nero fuggì nel deserto, ed il pistolero lo seguì....

MacBook Pro 15' 2009 - 8 GB RAM / iMac 2011 21,5 - 2,7 GHz - 12 GB RAM / iPod Touch 4th generazione / iPod nano 3th generazione / iPad 1th generazione 32GB

Link al commento
Condividi su altri siti

  • 3 settimane dopo...

RISOLTO: per completezza riporto la soluzione trovata sul web

Per interagire con un WebServices si utilizza il protocollo SOAP, questo prevede una definizione del servizio che viene richiesto all'interno di un xml che viene inviato al server tramite una chiamata http; il web services, normalmente, presena un file .wsdl che contiene i servizi esposti con la loro specifica.

Tramite un framework, ho utilizzato soapUI (free) per leggere il wsdl, a questo punto si hanno tutti gli xml che bisogna inviare al web services tramite la chiamata http.

All'interno di una NSString si inserisce l'xml relativo al servizio cui vogliamo accedere; in una NSURL si inserisce l'indirizzo del server che espone il web services, a questo punto si crea una NSMutableURLRequest definendogli l'URL da richiamara utilizzando l'NSURL, successivamente con il metodo addValue utilizzando il parametro forHTTPHeaderField vengono inseriti i parametri necessari per effettuare la richiesta, nel mio caso sempre con soapUI tramite il log http li ho identificati.

Alla fine si passa al metodo setHTTPBody si inserisce l'NSString contenente l'xml relativo al servizio.

Ultimo passo, tramite una NSURLConnection si invia la richiesta, a questo punto viene ritornata la risposta che dovrà essere parsata, ma questa è un'altra storia.

Per essere ancora più chiaro vi inserisco il codice, a cui per riservatezza elimino i riferimenti al web services reale.

NSString *soapMessage = [NSString stringWithFormat:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:rem=\"[i]URL server[/i]\">\n"
						 "<soapenv:Header/>\n"
						 "<soapenv:Body>\n"
						 "<rem:[i]nome servizio[/i]>\n"
						 "<rem:assetType>[i]valore[/i]</rem:assetType>\n"
						 "<rem:fieldName>[i]valore[/i]</rem:fieldName>\n"
						 "<rem:language>valore</rem:language>\n"
						 "</rem:[i]nome servizio[/i]>\n"
						 "</soapenv:Body>\n"
						 "</soapenv:Envelope>"
						 ];
NSLog(@"Richiesta inviata---%@",soapMessage);

NSURL *url = [NSURL URLWithString:@"[i]url a cui inviare la richiesta[/i]"];

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

[theRequest addValue: @"gzip,deflate" forHTTPHeaderField:@"Accept-Encoding"];
[theRequest addValue: @"text/xml;charset=UTF-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"[i]URL del metodo da utilizzare[/i]" forHTTPHeaderField:@"SOAPAction"];
[theRequest addValue: @"Jakarta Commons-HttpClient/3.1" forHTTPHeaderField:@"User-Agent"];
[theRequest addValue: @"10.21.20.49:8080" forHTTPHeaderField:@"Host"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

Spero che la soluzione sia di aiuto a tutti.

Mi rimane una unica domanda, in JAVA esistono vari framework che aiutano in questi casi, possibile chein xcoe nessuno ha mai dovuto sviluppare una cosa del genere, e quindi è necessario fare tutto a mano.

Un saluto

L'Uomo in Nero fuggì nel deserto, ed il pistolero lo seguì....

MacBook Pro 15' 2009 - 8 GB RAM / iMac 2011 21,5 - 2,7 GHz - 12 GB RAM / iPod Touch 4th generazione / iPod nano 3th generazione / iPad 1th generazione 32GB

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...