Bonjour à tous,
Je suis en train de créer un webservice qui est chargé d'interroger plusieurs autres webservices.
J'ai d'abord créé chacun des webservices "esclaves" sous la forme de cgi-bin, et ai obtenu leurs wsdl.
J'ai suivi la méthode de la documentation gSoap suivante pour atteindre plusieurs webservices depuis un seul et même client :
http://www.cs.fsu.edu/~engelen/soapd...tth_sEc19.36.1
J'ai donc procédé comme suit :
Dans le répertoire du WebService Maitre (/WSMaster) :
Création d'un fichier env.h vide et compilation :
Compilation de stdsoap2.cpp sans namespaces :Code:
1
2
3 ./soapcpp2 -penv env.h c++ -c envC.cpp
Copie des headers de chacun des webservices esclaves dans le répertoire maitre et ajout d'un namespace sur chacun des headers comme suit :Code:c++ -c -DWITH_NONAMESPACES stdsoap2.cpp
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // File: wsMail.h namespace wsMail { //gsoap ns service name: wsMail //gsoap ns service namespace: urn:wsMail //gsoap ns service location: http://adresse_du_webservice/slave.cgi #include <string> int ns__sendMail(int *r); int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r); int ns__getCpuLoad(int *r); }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // File: wsMailSlave1.h namespace wsMailSlave1 { //gsoap ns service name: wsMailSlave1 //gsoap ns service namespace: urn:wsMailSlave1 //gsoap ns service location: http://ADRESSE_WEB_SERVICE/slave1.cgi #include <string> int ns__sendMail(int *r); int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r); int ns__getCpuLoad(int *r); }
Puis, compilation de chacun de ces fichiers headers en tant que bibliothèque avec l'option -n pour renommer la table de namespaces :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 // File: wsMailSlave2.h namespace wsMailSlave2 { //gsoap ns service name: wsMailSlave2 //gsoap ns service namespace: urn:wsMailSlave2 //gsoap ns service location: http://ADRESSE_DU_WEBSERVICE/cgi-bin/slave2.cgi #include <string> int ns__sendMail(int *r); int ns__sendMailTo(std::string mailBrut, std::string mailFrom, std::string mailTo, int *r); int ns__getCpuLoad(int *r); }
Ensuite, je link les bibliothèques au webservice maitre en utilisant les fichiers "..."Proxy.h de chacun des esclaves :Code:
1
2
3
4
5
6
7
8 ./soapcpp2 -n wsMail.h c++ -c wsMailClientLib.cpp ./soapcpp2 -n wsMailSlave1.h c++ -c wsMailMailSlave1ClientLib.cpp ./soapcpp2 -n wsMailSlave2.h c++ -c wsMailSlave2ClientLib.cpp
Enfin, d'après la documentation, je suis sensé compiler et linker le client avec stdsoap2.o, envC.o, wsMailwsMailProxy.o, wsMailSlave1wsMailSlave1Proxy.o, et wsMailSlave2wsMailSlave2Proxy.o.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 #include <iostream> #include <string> #include "smtp.h" #include "soapH.h" #include "soapStub.h" #include "wsMaster.nsmap" #include "getCpuStat.h" #include "wsMailwsMailProxy.h" #include "wsMailSlave1wsMailSlave1Proxy.h" #include "wsMailSlave2wsMailSlave2Proxy.h" #include "wsMail.nsmap" #include "wsMailSlave1.nsmap" #include "wsMailSlave2.nsmap" //using namespace std; int main() { // create soap context and serve one CGI-based request: return soap_serve(soap_new()); } int ns__sendMail(struct soap *soap, int *r) { ... } int ns__sendMailTo(struct soap *soap, std::string mailBrut, std::string mailFrom, std::string mailTo, int *r) { ... } int ns__getCpuLoad(struct soap *soap, int *r) { ... } int ns__getLessLoadedServer(struct soap *soap, std::string *wsdl) { wsMail::wsMail ws; int wsCpu = 100; ws.ns__getCpuLoad(&wsCpu); wsMailSlave1::wsMailSlave1 ws1; int ws1Cpu = 100; ws1.ns__getCpuLoad(&ws1Cpu); wsMailSlave2::wsMailSlave2 ws2; int ws2Cpu = 100; ws2.ns__getCpuLoad(&ws2Cpu); "......" return SOAP_OK; }
Le problème est que les fichiers "..."Proxy.o ne sont pas créés en suivant les étapes données par la documentation gSoap, puisque nous ne compilons pas les fichiers "..."Proxy.h
Je tente donc la commande suivante pour compiler mon maitre (main.cpp) lui même webService avec les fichiers "..."Proxy.h afin d'accéder aux webservices esclaves :
Voici le résultat de la compilation :Code:c++ -o wsMaster.cgi main.cpp smtp.h explode.h getCpuStat.h stringToInt.h soapC.cpp soapH.h soapServer.cpp stdsoap2.cpp wsMailwsMailProxy.h wsMailSlave1wsMailSlave1Proxy.h wsMailSlave2wsMailSlave2Proxy.h
Si quelqu'un peut m'apporter l'étincelle qui me permettra d'arriver au bout de ce problème, cela serai très sympa, je suis dessus depuis 2 jours :aie:Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)': main.cpp:(.text._ZN6wsMail6wsMail14ns__sendMailToESsSsSsPi[wsMail::wsMail::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMail::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)' /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__sendMail(int*)': main.cpp:(.text._ZN6wsMail6wsMail12ns__sendMailEPi[wsMail::wsMail::ns__sendMail(int*)]+0x37): undefined reference to `wsMail::soap_call_ns__sendMail(soap*, char const*, char const*, int*)' /tmp/cc03tcd8.o: In function `wsMail::wsMail::ns__getCpuLoad(int*)': main.cpp:(.text._ZN6wsMail6wsMail14ns__getCpuLoadEPi[wsMail::wsMail::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMail::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)': main.cpp:(.text._ZN12wsMailSlave112wsMailSlave114ns__sendMailToESsSsSsPi[wsMailSlave1::wsMailSlave1::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMailSlave1::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__sendMail(int*)': main.cpp:(.text._ZN12wsMailSlave112wsMailSlave112ns__sendMailEPi[wsMailSlave1::wsMailSlave1::ns__sendMail(int*)]+0x37): undefined reference to `wsMailSlave1::soap_call_ns__sendMail(soap*, char const*, char const*, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave1::wsMailSlave1::ns__getCpuLoad(int*)': main.cpp:(.text._ZN12wsMailSlave112wsMailSlave114ns__getCpuLoadEPi[wsMailSlave1::wsMailSlave1::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMailSlave1::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)': main.cpp:(.text._ZN12wsMailSlave212wsMailSlave214ns__sendMailToESsSsSsPi[wsMailSlave2::wsMailSlave2::ns__sendMailTo(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)]+0xba): undefined reference to `wsMailSlave2::soap_call_ns__sendMailTo(soap*, char const*, char const*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__sendMail(int*)': main.cpp:(.text._ZN12wsMailSlave212wsMailSlave212ns__sendMailEPi[wsMailSlave2::wsMailSlave2::ns__sendMail(int*)]+0x37): undefined reference to `wsMailSlave2::soap_call_ns__sendMail(soap*, char const*, char const*, int*)' /tmp/cc03tcd8.o: In function `wsMailSlave2::wsMailSlave2::ns__getCpuLoad(int*)': main.cpp:(.text._ZN12wsMailSlave212wsMailSlave214ns__getCpuLoadEPi[wsMailSlave2::wsMailSlave2::ns__getCpuLoad(int*)]+0x37): undefined reference to `wsMailSlave2::soap_call_ns__getCpuLoad(soap*, char const*, char const*, int*)' collect2: ld returned 1 exit status
Merci de m'avoir lu !