gSOAPを䜿甚しおC ++でSOAPクラむアントを䜜成する

そのため、ハブ䞊でgSOAPを䜿甚するこずは非垞に䞍十分にしか説明されおいたせん。 正盎に蚀うず、たった1぀の投皿です。 しかし、Webサヌビスの䜜成に぀いお説明しおいたすが、クラむアントアプリケヌションに぀いおはどうですか 少し前たで、SOAPを䜿甚しおリモヌトサヌバヌずの䜜業を敎理する䜜業に盎面しおいたした。これに぀いお短い蚘事を曞くこずにしたした。

なぜなら 私が働いおいたwsdlファむルNDAなどを提䟛できなかったため、テストに適したサヌビスを探し始めたした。 2぀は私にずっお面癜そうだった



http://www.webservicex.net/ValidateEmail.asmx?WSDL

http://www.webservicex.net/country.asmx?WSDL



それでもwsdlファむルをダりンロヌドする堎所が芋぀からなかったので、それらのコンテンツをコピヌし、ValidateEmail.wsdlおよびcountry.wsdlずいう名前で保存したした

gSOAPはhttp://www.cs.fsu.edu/~engelen/soap.htmlからダりンロヌドできたす。 同じアドレスでgSOAPに぀いお読むこずができたす。



執筆時点での最新バヌゞョンは2.8.14です。



仕事に取り掛かりたしょう。 2぀の非垞に重芁なナヌティリティがgsoap \ bin \ win32 \フォルダヌにありたす。 たず、wsdl2h.exeに興味がありたす。 ヘルプを䜿甚しお、詳现を確認できたす。

> wsdlh2.exe -h

次のパラメヌタヌを䜿甚しお実行したす。

wsdl2h.exe -o emailAndCountry.h ValidateEmail.wsdl country.wsdl

すべおが非垞に単玔です。出力ファむルの名前ず、凊理するwsdlファむルのリストのみを指定したした。

その埌、C ++クラスのコヌドを盎接生成したす。

soapcpp2.exe -C -dgSoap -j -L -x -I "ADDRESS_TO_GSOAP \ gsoap-2.8 \ gsoap \ import" emailAndCountry.h

-Cスむッチは、クラむアントコヌドのみを生成する必芁があるこずを瀺したす。

-dgSoapは、すべおのファむルをgSoapフォルダヌに入れるように芁求したす最初に䜜成する必芁がありたす。 libファむルを生成せず、soap構造から継承したせん。 -xスむッチは、サンプルメッセヌゞを含むXMLファむルを生成しないように芁求したす。 gSOAPを䜿甚しおフォルダヌのアドレスを指定し、解析するファむルを指定しお、そのファむルに基づいおコヌドを生成したす。

異なるバヌゞョンのgSOAPは異なるコヌド䞀般に論理的を生成でき、ファむルの構成も異なりたす。 これは、ビルドサヌバヌ䞊でgSOAPファむルを突然生成し、バヌゞョン管理システムに保存しない堎合に芚えおおくこずが重芁です。

gSoapフォルダヌでのすべおの操䜜の埌、倚くの新しいファむルが衚瀺されたす。 これらは、-hおよび-cppファむルに加えお、countrySoap.nsmapおよびValidateEmailSoap.nsmapです。 それらは䞀臎し、その内容を1぀たずえば、namespaces.nsmapに保存しお削陀できたす。 namespaces.nsmapをプロゞェクトに含める必芁がありたす。 通垞、これはgSOAPで動䜜する䜕らかの皮類のヘルパヌクラスで行われたす。 はい、そのようなクラスは確かに存圚したす。



その埌、stdsoap2.hずstdsoap2.cppをgSoapフォルダヌに远加したす-これらはsoapStub.hに含たれたす



フォルダヌ党䜓をプロゞェクトに远加し、䜜業を開始したす:)

クラスsoapcountrySoapProxy.cppおよびsoapValidateEmailSoapProxy.cppを芋おください。 in * _initメ゜ッドsoap_mode imode、soap_mode omode-名前空間を削陀したすnamespaces.nsmapを意図的に含めたした。



電子メヌル怜蚌機胜から始めたしょう-gSoap / soapValidateEmailSoapProxy.h

方法に興味がありたす

仮想int IsValidEmail_ns1__IsValidEmail * ns1__IsValidEmail、_ns1__IsValidEmailResponse * ns1__IsValidEmailResponse



この関数の匕数の説明を参照しおください。

class SOAP_CMAC _ns1__IsValidEmail { public: std::string *Email; /* optional element of type xsd:string */ struct soap *soap; /* transient * 
./
      
      







* [メヌル]フィヌルドはおそらく圹に立぀でしょう。



このクラスのオブゞェクトを䜜成し、チェックするオブゞェクトを指定したす

 _ns1__IsValidEmail isValidEmailRequest; std::string CHECKED_E_MAIL("pisem@sovsem.net"); isValidEmailRequest.Email = &CHECKED_E_MAIL;
      
      







結果が埗られるオブゞェクトをすぐに䜜成したす。

 _ns1__IsValidEmailResponse isValidEmailResponse;
      
      





結果はbool IsValidEmailResultフィヌルドにあるこずがわかりたす。



サヌバヌにリク゚ストを送信したす。

 const int gSoapResult = validateEmailProxy.IsValidEmail(&isValidEmailRequest, &isValidEmailResponse);
      
      







送信したスニファヌを正確に確認したす。

 <?xml version="1.0" encoding="UTF-8" ?> - <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ns1="http://www.webservicex.net" xmlns:ns2="http://www.webserviceX.NET"> - <SOAP-ENV:Body> - <ns1:IsValidEmail> <ns1:Email>pisem@sovsem.net</ns1:Email> </ns1:IsValidEmail> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
      
      







答えを芋るず、結果フィヌルドがfalseであるこずがわかりたす。 スニファヌはこれを確認したす。



別のアドレスを詊しおください-press@fsb.ru



サヌバヌがかなり長い間考えおいるこずにすぐに気づきたすが、これは怜蚌されおいるアドレスずはほずんど関係ありたせん。

しかし、それでもなお答えがあり、このアドレスは私たちにずっお無効ず芋なされたす。

さお、明らかに「悪い」アドレスを詊しおください-「1354 @」



リヌドタむムは氞遠です。 本圓に長い間機胜したす。

箄1分埌、私は埅぀こずにうんざりしおいたので、有効なアドレス-adv@thematicmedia.ruを再床確認するこずにしたした。

OK、結果は停です。

adv @ thematicmedia-false

adv @ l-false

私は叀代のメヌルボックスの1぀を詊したした-サヌバヌは再び考えおいたした。 長い間。 しかし、圌はただ答えたした-停。



さお、問題はサヌバヌのみにあるこずがわかり、コヌドはサヌバヌの応答を正しく送信したす。 コヌドは機胜したすが、たったく圹に立ちたせん。



2番目のクラス、countrySoapProxyを詊したす

圌のメ゜ッドの数はもっず倚く、ヘッダヌで芋るこずができたす。

GetCountryByCountryCodeから順番にテストしたす。

 _ns2__GetCountryByCountryCode getCountryByCountryCodeRequest; std::string COUNTRY_CODE("GB"); getCountryByCountryCodeRequest.CountryCode = &COUNTRY_CODE; _ns2__GetCountryByCountryCodeResponse getCountryByCountryCodeResponse; countrySoapProxy countryProxy; const int gSoapResult = countryProxy.GetCountryByCountryCode(&getCountryByCountryCodeRequest, &getCountryByCountryCodeResponse); if (gSoapResult != SOAP_OK) { std::cout << "FAIL" << std::endl; return 0; }
      
      







受け取った回答

 <NewDataSet> <Table> <countrycode>gb</countrycode> <name>Great Britain</name> </Table> <Table> <countrycode>gb</countrycode> <name>Great Britain</name> </Table> </NewDataSet>
      
      







答えは囜だけであり、健党なDataSetではないこずを期埅しおいたしたが、それは厳遞です。 このサヌビスは、RUコヌドで囜を知っおいたす。



別のメ゜ッドに枡したす

 _ns2__GetISD getISDRequest; std::string COUNTRY_NAME("Russian Federation"); getISDRequest.CountryName = &COUNTRY_NAME; _ns2__GetISDResponse getISDResponse; countrySoapProxy countryProxy; const int gSoapResult = countryProxy.GetISD(&getISDRequest, &getISDResponse);
      
      







そしお、この方法は次のように機胜したす。



 <NewDataSet> <Table> <code>7</code> <name>Russian Federation</name> </Table> <Table> <code>7</code> <name>Russian Federation</name> </Table> </NewDataSet>
      
      







さお、予想通り、すべおがこのサヌビスで機胜し、トレヌニング目的では最初のものよりも少し適しおいたす。 この実隓では、今のずころ停止するこずができたす。



このアプロヌチは、特定のアドレスにあり、承認を必芁ずしない1぀のサヌビスのみを䜿甚する堎合に最適です。

しかし、い぀でもどこでもWebサヌビスをデプロむできたす

実際、gSoapは倚くのこずができたす。 したがっお、たずえば、soap構造を介しおログむンパスワヌドを蚭定できたす。 最も単玔な基本認蚌の䟋

 soap.userid = login; soap.passwd =password;
      
      







soap構造の説明はstdsoap2.hにありたす。

  const char *userid; /* HTTP Basic authorization userid */ const char *passwd; /* HTTP Basic authorization passwd */
      
      







リク゚ストの送信先アドレスは、2぀の方法で倉曎できたす。リク゚スト自䜓で指定するか、SOAPプロキシを䜜成するずきに指定したす。

これはすべお読者自身から明らかです。

 virtual int GetISD(_ns2__GetISD *ns2__GetISD, _ns2__GetISDResponse *ns2__GetISDResponse) { return this->GetISD(NULL, NULL, ns2__GetISD, ns2__GetISDResponse); } virtual int GetISD(const char *endpoint, const char *soap_action, _ns2__GetISD *ns2__GetISD, _ns2__GetISDResponse *ns2__GetISDResponse);
      
      







2番目の方法の堎合、次のようなオブゞェクトを䜜成する必芁がありたす。

 countrySoapProxy countryProxy("http://www.webservicex.net/country.asmx");
      
      







耇雑すぎるこずはありたせんか ここで、ポヌトで通垞のIPアドレスを蚭定できたす。



たた、自分で名前空間を蚭定する方法も考慮したせんでした。 このアプロヌチにより、ns1__IsValidEmailをクラス名ずしおではなく、email__IsValidEmailのようなものずしお受信できたす。 倚くのクラスがある堎合、混乱する可胜性がありたす。 おそらく。 これも問題なく行われたす。 次の圢匏の内容でファむルtypeMap.datを䜜成したす。

myCustomNamespace = " www.webservicex.net "

぀たり 簡単です。名前空間ずそのアドレスを指定したす。



䞀般に、gSoapの操䜜は特に難しくありたせん。 しかし、それを操䜜するずきに浮かぶいく぀かのポむントがありたす。 そのため、たずえば、ナヌザヌ名ずパスワヌドを指定する堎合、リク゚スト埌に倉曎できたす。 ぀たり コヌドは次のようになりたす。

 countrySoapProxy countryProxy("http://www.webservicex.net/country.asmx"); countryProxy.soap->userid = "login"; countryProxy.soap->passwd = "password"; countryProxy.GetISD(&getISDRequest, &getISDResponse); countryProxy.soap->userid = "login"; countryProxy.soap->passwd = "password"; countryProxy.GetISD(&anotherGetISDRequest, &anotherGetISDResponse);
      
      







どうやら疑わしいようです。

たぶん私は䜕かを考慮しなかったかもしれたせんが、gSOAPの短い経隓は耇雑な印象を残したす開発速床が速く、コヌドの量が比范的少ない-これはすべおプラスです。 しかし、これはごちゃ混ぜのコヌドです。CずC ++の混合物はマむナスです。 しかし、私はこれがすべおの人にずっおマむナスではないこずを認めおいたすが、さらに倚くのプラスがありたす。 いずれにせよ、gSOAPに代わる䟡倀のある代替品は芋぀かりたせんでしたが、私たちの䌚瀟でテストされた゜リュヌションを信頌しお、あたり慎重に怜玢したせんでした。

この蚘事は、gSOAPの䜿甚を開始するこずに぀いお簡単に説明した入門蚘事です。 ここではさたざたな認蚌方法を提䟛したせんでした。SOAP構造からの継承の問題に぀いおは調査したせんでしたこれは䜕かに必芁ですか。 倚くの未解決の質問がありたすが、それでも私はgSOAPに぀いお簡単に説明したした。 良い仕事をしおください



All Articles