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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part c++ -c -DWITH_NONAMESPACES stdsoap2.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 !
Partager