以下は、Borland C++ Builder 6 で開発されたアプリケーションで Web サービス クライアントを開発する段階的な試みです。 C++ ビルダー XE3)。これは、Borland 6 C++ Builder で Soap を使用する試みです。Borland 6 は SOAP ヘッダー (InvokeRegistry.hpp がない) を管理しておらず、リクエストを送信する SOAP サーバーは、このインターフェースのログイン後に Cookie を渡す必要があるため、これまでは成功できなかったと結論付けています。
__interface INTERFACE_UUID("{B0F412ED-AC6A-42C3-8730-DD0D9680F16D}") AuthenticationSoap : public IInvokable
{
public:
virtual LoginResult* Login(const AnsiString username, const AnsiString password) = 0;
virtual AuthenticationMode Mode() = 0;
};
typedef DelphiInterface<AuthenticationSoap> _di_AuthenticationSoap;
このログインは最初に次を送信します。
500 Server Internal Error
この呼び出しを追加すればOKです:
InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(AuthenticationSoap), ioDocument);
次に、ユーザー名を HTTPRIO に渡します。
MyHTTPRIO->HTTPWebNode->UserName = AnsiString("xxx...");
そして、この HTTPRIO が 2 番目のインターフェースに渡されます。
__interface INTERFACE_UUID("{1E5B3820-A40E-FD40-326D-95A9F6B7A5F0}") OrganizerWS_1_1Soap : public IInvokable
{
public:
...
virtual void findHorse(const ArrayOfString FEIIDs, const AnsiString Name, const AnsiString SexCode, const bool IsPony, const AnsiString AthleteFEIID, ArrayOfHorseOC& findHorseResult, ArrayOfMessage& Messages) = 0;
...
};
typedef DelphiInterface<OrganizerWS_1_1Soap> _di_OrganizerWS_1_1Soap;
_di_OrganizerWS_1_1Soap GetOrganizerWS_1_1Soap(bool useWSDL=false, AnsiString addr="", Soaphttpclient::THTTPRIO* HTTPRIO=0);
しかし、ヘッダーのコードを生成しない Borland 6 の WSDL インポーターを使用しており、ヘッダーが Invokeregistry.hpp で定義されていないため、「AuthHeader is missing」というエラーが発生します。したがって、HTTPRIO の「BeforeExecute」には、次の要求があります。
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Body>
<findHorse xmlns="http://fei.org/">
<FEIIDs/>
<Name></Name>
<SexCode></SexCode>
<IsPony>false</IsPony>
<AthleteFEIID>10002254</AthleteFEIID>
<findHorseResult/>
<Messages/>
</findHorse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
一方、Borland XE3 はこの要求を生成しますが、これは問題なく、サーバーから期待される応答をもたらします。
<?xml version="1.0"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<NS1:AuthHeader xmlns:NS1="http://fei.org/">
<UserName xmlns="http://fei.org/">xxx...</UserName>
<Language xmlns="http://fei.org/">en</Language>
</NS1:AuthHeader>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<findHorse xmlns="http://fei.org/">
<IsPony>false</IsPony>
<AthleteFEIID>10002254</AthleteFEIID>
</findHorse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
だからまず交換した
<SOAP-ENV:Body>
に
<SOAP-ENV:Header><NS1:AuthHeader xmlns:NS1="http://fei.org/"><UserName xmlns="http://fei.org/">xxx...</UserName><Language xmlns="http://fei.org/">en</Language></NS1:AuthHeader></SOAP-ENV:Header><SOAP-ENV:Body>
次に、「<< xoHolderClass << xoInlineArrays」などのオプションを追加しました。
RemClassRegistry()->RegisterSerializeOptions(__classid(findHorse), (TSerializationOptions() << xoHolderClass << xoInlineArrays));
ここで同じ要求を取得しますが、サーバーの応答は NULL 配列ですが、borland xe3 で記述されたテストへの応答には 3 つの項目があります。または、他の操作 (xo... オプションなし) を使用すると、デルファイ インターフェイスのデストラクタでアクセス違反が発生します。
__fastcall ~DelphiInterface<T>()
{
if (intf != 0)
{
intf->Release();
intf = 0;
}
}
CAPICOM を使用して、XML を作成し、Indy コンポーネントで送信することを考えました (ただし、同じ認証ヘッダーの問題が発生することを期待していますか?)、CAPICOM を使用するか、またはWindows SDK ? ...) しかし、今まで成功せず、前に述べたように、C++ Builder XE3 で開発された dll を使用しようとしています: https://stackoverflow.com/questions/15485276/embarcadero-c-xe3-dll-imported -in-c-xe3-project-library-loads-but-access-v