我自己的SOAP代码?

时间:2011-11-21 10:21:05

标签: xml delphi post soap native

D6教授。

我们必须使用SOAP XML服务。 我试图导入wsdl,并使用Delphi生成的接口,但它失败了。

并且:我认为我必须在XML部分提供用户名和密码,但我不知道如何处理这个自动界面......

我确定我手工提供XML。 这不是问题,问题是如何发布到服务器... wsdl导入知道如何调用服务器。它知道网址,端口等。

我想写自己的代码。我认为SOAP调用是使用“Post”方法,我可以轻松完成。 但是帖子需要什么参数? 哪些参数是SOAP服务器读取的内容?

要理解我所说的内容,请参阅此代码(FParams:TStrings):

procedure TDDHTTPObject.Post;
var
    WinHttpReq : variant;
    posts : string;
begin
    Result := '';
    WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
    try
        posts := EncodeParamsToURL(FParams);
        URL := URL + '?' + posts;
        WinHttpReq.Open('POST', URL, false);
        WinHttpReq.Send();
        Result := WinHttpReq.ResponseText;
    finally
        WinHttpReq := 0;
    end;
end;

例如:

Params['data'] = xmlstring;

Params['soap'] = xmlstring;

你对此有所了解吗?

2 个答案:

答案 0 :(得分:3)

实例化您自己的THttpRio组件并将其传递给Web服务调用。使用THttpRio.BeforeExecute事件在将SOAPRequest流发送到服务之前修改它。那里有很多例子,但请THttprio onBeforeExecute changing the soapRequest作为一个让你前进的例子。

答案 1 :(得分:3)

如果使用.NET作为Web服务器,则可以在浏览到WS URL时看到方法和原始XML,即: http://yourdomain.com/ws/ApplicationWebService.asmx

XML可用于SOAP 1.1和1.2 它可能看起来像这样(SOAP 1.1):

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <UserIdentificationHeader xmlns="http://yourdomain.com/ws">
      <UserAgent>string</UserAgent>
      <UserToken>string</UserToken>
    </UserIdentificationHeader>
  </soap:Header>
  <soap:Body>
    <MyTestMethod xmlns="http://yourdomain.com/ws" />
  </soap:Body>
</soap:Envelope>

接下来我像这样使用“MSXML2.XMLHTTP”:

var
  mhttp: OleVariant;

URL := 'http://yourdomain.com/ws/ApplicationWebService.asmx';
mhttp := CreateOleObject('MSXML2.XMLHTTP');
mhttp.Open('POST', URL, False);  // False=synchronously
mhttp.setRequestHeader('User-Agent', APP_WS_USER_AGENT); // optional
mhttp.setRequestHeader('Content-Type', 'text/xml; charset=utf-8');
mhttp.setRequestHeader('SoapAction', 'http://yourdomain.com/ws/' + 'MyTestMethod');

mhttp.send(TheSOAPXML);

if mhttp.Status = 202 then ShowMessage('ACCEPTED OK!');