2

TXMLDataを使用してXMLを送信しており、Delphiはリクエストにタグを追加しています。私のコードは、次のようになっています。

RequestData := TXMLData.Create;
RequestData.LoadFromXML('<MyXML>[contents here]</MyXML>');

MyService.ExecuteRequest(RequestData);

THTTPRIOのOnBeforeExecuteを使用してリクエストのコンテンツを取得し、コンテンツは次のようなタグでラップされています。

<SOAP-ENV:Body>
    <schema xmlns="http://www.w3.org/2001/XMLSchema">
              <MyXML>
    </schema>
</SOAP-ENV:Body>

このタグが追加されている理由がわかりません。追加されないようにするにはどうすればよいですか?

また、OnBeforeExecuteイベントでSOAPRequestを編集して、そこにあることを知らずに削除するというアイデアは好きではありません。

4

3 に答える 3

1

<MyXML>Delphiが見て考えているように見えます

「このXMLには名前空間が関連付けられていないので、名前空間にスローしXMLSchemaます。この名前空間はまだSOAPメッセージの名前空間に含まれていないので、SOAPサーバーを幸せにするために追加します。 「」

  • <MyXML>あなたの例では、整形式のXMLドキュメントではないことに注意してください。冒頭の「タグ」のみです。

TXMLDataの詳細はわかりませんが、名前空間をサポートしている可能性があります。たぶん、XMLドキュメントに名前空間宣言を追加すると、SOAPリクエストの見栄えが良くなります。


SOAPリクエスト本文の例(ウィキペディアから):

<s:Body>
    <m:TitleInDatabase xmlns:m="http://www.lecture-db.de/soap">
        DOM, SAX and SOAP
    </m:TitleInDatabase>
</s:Body>

これは、SOAP本体がルート要素に名前空間宣言を持つ「スタンドアロン」XMLドキュメントである可能性があることを示しています(あなたの場合のように別個の外部要素ではありません)。

于 2012-09-07T12:44:39.607 に答える
1

解決しました。

DelphiはWebサービスを次のようにマッピングしていました。

RequestData = TXMLData;

MyService = interface(IInvokable)
  ['{5D2D1DD8-AE56-AD82-FC59-8669C576E1AF}']
  function ExecuteRequest(const RequestData: RequestData): RequestResult; stdcall;
end;

変化:

RequestData = TXMLData;

RequestData = class(TXMLData);

問題を解決しました。

現在、delphiは、スキーマタグを追加する代わりに、リクエストの本文のXMLのトップノードとして「RequestData」を使用しています。

これで、呼び出しは次のようなものを生成します。

<RequestData>[MyXML]</RequestData>

それは私が送る必要があるものです。

于 2012-09-10T16:19:42.130 に答える
0

ヒットしなければならない非準拠のWebサービスがあるようですが、SOAPライブラリが邪魔になっています。そのため、OnBeforeExecuteハンドラーで要求を置き換える「ブルートフォース」アプローチに頼る必要がある場合があります。ただし、その前に、SoapUIを使用してサービスWSDLを使用してみます。SoapUIリクエストがサービスによって受け入れられるかどうかを確認します。リクエストを大幅に編集しないとそれが機能しない場合は、上記のアプローチが正当化されます。

于 2012-09-07T12:28:34.223 に答える