是否可以使用Delphi ..发送和接收XML到WSDL函数? [英] Is it possible to send and receive XML to WSDL function using Delphi..?

查看:64
本文介绍了是否可以使用Delphi ..发送和接收XML到WSDL函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们过去曾在Delphi中使用过Web服务,但这些服务很简单,几乎没有参数,并且向客户端返回了一个值。我们正在使用的一项新服务应该能够XML输入和接收XML输出。

We have used Web Services with Delphi in the past and those are simple with few parameters and returned a single value to the client. A new service we working should able to XML input and receive XML output.

是否有可用于此目的的组件网?

Is there any componenet which can be used for this purpose?

当我尝试如下使用时,出现错误 SearchAgreements输入参数XmlElement中的异常-System.NullReferenceException:对象引用未设置为对象的实例。

When i tried using like below am getting an error "Exception in SearchAgreements input parameter XmlElement - System.NullReferenceException: Object reference not set to an instance of an object."

  LDocument := NewXMLDocument;
  <<framed an XML input>>
  DocSearchOut := SearchArgsResponse.Create();
  DoxSerchIn := SearchArgs.Create();
  DoxSerchIn.SOAPTOObject(LDocument.DocumentElement,LDocument.DocumentElement,HTTPRIO1.Converter);
  DoxService := GetIDoxService(True,'',HTTPRIO1);
  DocSearchOut :=DoxService.SearchAgreements(DoxSerchIn)

我什至尝试将SearchArgs转换为宽字符串并尝试将其作为字符串传递。这与HTTPRIO执行中的微小更改有关。最终编辑

I even tried converting SearchArgs as widestring and tried to pass as a string.This is working with minor changes on HTTPRIO execute. Final Edit

  LDocument := NewXMLDocument;
  <<framed an XML input>>
  DocSearchOut := SearchArgsResponse.Create();
  DoxSerchIn := SearchArgs.Create();
  DoxSerchIn.SearchArgs := LDocument.DocumentElement.XML;
  DoxService := GetIDoxService(True,'',HTTPRIO1);
  DocSearchOut :=DoxService.SearchAgreements(DoxSerchIn)

其wsdl

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://tempuri.org/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:i0="http://www.bank.com/dox/service/v1.0.0" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" name="DoxService" targetNamespace="http://tempuri.org/">
<wsdl:import namespace="http://www.bank.com/dox/service/v1.0.0" location="http://devldn.ldn.bank.com:8258/doxManual/DoxService.svc?wsdl=wsdl0"/>
<wsdl:types/>
<wsdl:binding name="BasicHttpBinding_IDoxService" type="i0:IDoxService">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="SearchAgreements">
<soap:operation soapAction="http://www.bank.com/dox/service/v1.0.0/IDoxService/SearchAgreements" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="DoxService">
<wsdl:port name="BasicHttpBinding_IDoxService" binding="tns:BasicHttpBinding_IDoxService">
<soap:address location="http://devldn.ldn.bank.com:8258/doxManual/DoxService.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>

wsdl0

<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:tns="http://www.bank.com/dox/service/v1.0.0" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" targetNamespace="http://www.bank.com/dox/service/v1.0.0">
<wsdl:types>
<xsd:schema targetNamespace="http://www.bank.com/dox/service/v1.0.0/Imports">
<xsd:import schemaLocation="http://ldndev.ldn.bank.com:8258/doxManual/DoxService.svc?xsd=xsd0" namespace="http://www.bank.com/dox/service/v1.0.0"/>
<xsd:import schemaLocation="http://ldndev.ldn.bank.com:8258/doxManual/DoxService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IDoxService_SearchAgreements_InputMessage">
<wsdl:part name="parameters" element="tns:SearchAgreements"/>
</wsdl:message>
<wsdl:message name="IDoxService_SearchAgreements_OutputMessage">
<wsdl:part name="parameters" element="tns:SearchAgreementsResponse"/>
</wsdl:message>
<wsdl:portType name="IDoxService">
<wsdl:operation name="SearchAgreements">
<wsdl:input wsaw:Action="http://www.bank.com/dox/service/v1.0.0/IDoxService/SearchAgreements" message="tns:IDoxService_SearchAgreements_InputMessage"/>
<wsdl:output wsaw:Action="http://www.bank.com/dox/service/v1.0.0/IDoxService/SearchAgreementsResponse" message="tns:IDoxService_SearchAgreements_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>

xsd0

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.bank.com/dox/service/v1.0.0" elementFormDefault="qualified" targetNamespace="http://www.bank.com/dox/service/v1.0.0">
<xs:element name="SearchAgreements">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="searchRequest" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="SearchAgreementsResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="SearchAgreementsResult" nillable="true">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" processContents="lax"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

xsd1

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.microsoft.com/2003/10/Serialization/" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/2003/10/Serialization/">
<xs:element name="anyType" nillable="true" type="xs:anyType"/>
<xs:element name="anyURI" nillable="true" type="xs:anyURI"/>
<xs:element name="base64Binary" nillable="true" type="xs:base64Binary"/>
<xs:element name="boolean" nillable="true" type="xs:boolean"/>
<xs:element name="byte" nillable="true" type="xs:byte"/>
<xs:element name="dateTime" nillable="true" type="xs:dateTime"/>
<xs:element name="decimal" nillable="true" type="xs:decimal"/>
<xs:element name="double" nillable="true" type="xs:double"/>
<xs:element name="float" nillable="true" type="xs:float"/>
<xs:element name="int" nillable="true" type="xs:int"/>
<xs:element name="long" nillable="true" type="xs:long"/>
<xs:element name="QName" nillable="true" type="xs:QName"/>
<xs:element name="short" nillable="true" type="xs:short"/>
<xs:element name="string" nillable="true" type="xs:string"/>
<xs:element name="unsignedByte" nillable="true" type="xs:unsignedByte"/>
<xs:element name="unsignedInt" nillable="true" type="xs:unsignedInt"/>
<xs:element name="unsignedLong" nillable="true" type="xs:unsignedLong"/>
<xs:element name="unsignedShort" nillable="true" type="xs:unsignedShort"/>
<xs:element name="char" nillable="true" type="tns:char"/>
<xs:simpleType name="char">
<xs:restriction base="xs:int"/>
</xs:simpleType>
<xs:element name="duration" nillable="true" type="tns:duration"/>
<xs:simpleType name="duration">
<xs:restriction base="xs:duration">
<xs:pattern value="\-?P(\d*D)?(T(\d*H)?(\d*M)?(\d*(\.\d*)?S)?)?"/>
<xs:minInclusive value="-P10675199DT2H48M5.4775808S"/>
<xs:maxInclusive value="P10675199DT2H48M5.4775807S"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="guid" nillable="true" type="tns:guid"/>
<xs:simpleType name="guid">
<xs:restriction base="xs:string">
<xs:pattern value="[\da-fA-F]{8}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{4}-[\da-fA-F]{12}"/>
</xs:restriction>
</xs:simpleType>
<xs:attribute name="FactoryType" type="xs:QName"/>
<xs:attribute name="Id" type="xs:ID"/>
<xs:attribute name="Ref" type="xs:IDREF"/>
</xs:schema>

Service的输入。很不幸,团队添加了一些东西,因此无法在SOAP UI上检索输出。

Input to Service..unfortunetely,team has added few things so unable to retrieve output on SOAP UI.

   <AgreementSearchRequest xmlns="http://www.bank.com/dox/service/v1.0.0" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Header>
    <PageNo>1</PageNo>
    <PageSize>10</PageSize>
    <Source>IBFD</Source>
  </Header>
  <SearchCriteria>
    <AgreementId>10</AgreementId>
    <AgreementStatus>Search Status</AgreementStatus>
    <AgreementType>Search Type</AgreementType>
    <AgreementVersion>Search Version</AgreementVersion>
    <CompletedDate>2014-05-30T15:56:45.7533005+05:30</CompletedDate>
    <ContractingEntity>Search GCRS Code</ContractingEntity>
    <CounterpartyBranch>Search CP Branch</CounterpartyBranch>
    <CounterpartyEMID>Search CP EMID</CounterpartyEMID>
    <CounterpartyId>Search CP ID</CounterpartyId>
    <CounterpartyName>Search CP Name</CounterpartyName>
    <CounterpartyType>Search CP Type</CounterpartyType>
    <CreditContact>Search Contact</CreditContact>

    <IsOffshoreUser>true</IsOffshoreUser>
    <Products>
      <Product>
        <ProductCode>Search Code</ProductCode>:=
        <ProductName i:nil="true"/>
      </Product>
    </Products>
    <RXM>Search RXM</RXM>
    <RequestedDate>2014-05-30T15:56:45.758183+05:30</RequestedDate>
    <bankLegalEntity>Search LEgal Entity</bankLegalEntity>
    <bankLegalEntityCategory>Search Legal Entity Category</bankLegalEntityCategory>
    <UmbrellaCounterpartyEMID>Search Agent EMID</UmbrellaCounterpartyEMID>
    <UmbrellaCounterpartyName>Search Agent Name</UmbrellaCounterpartyName>
  </SearchCriteria>

我尝试导入xsd并替换xml文件HTTPRIO,然后按上述此处。.

I tried importing xsd and replacing xml file HTTPRIO Before execute as mentioned here..

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:tns="http://www.bank.com/dox/service/v1.0.0" elementFormDefault="qualified" targetNamespace="http://www.bank.com/dox/service/v1.0.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="ArrayOfProduct">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Product" nillable="true" type="tns:Product" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="ArrayOfProduct" nillable="true" type="tns:ArrayOfProduct" />
  <xs:complexType name="Product">
    <xs:sequence>
      <xs:element minOccurs="0" name="ProductCode" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="ProductName" nillable="true" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="Product" nillable="true" type="tns:Product" />
    <xs:complexType name="AgreementSearchRequest">
    <xs:sequence>
      <xs:element name="Header" nillable="true" type="tns:AgreementSearchRequestHeader" />
      <xs:element name="SearchCriteria" nillable="true" type="tns:AgreementSearchCriteria" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="AgreementSearchRequest" nillable="true" type="tns:AgreementSearchRequest" />
  <xs:complexType name="AgreementSearchRequestHeader">
    <xs:sequence>
      <xs:element name="PageNo" type="xs:int" />
      <xs:element name="PageSize" type="xs:int" />
      <xs:element name="Source" nillable="true" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="AgreementSearchRequestHeader" nillable="true" type="tns:AgreementSearchRequestHeader" />
  <xs:complexType name="AgreementSearchCriteria">
    <xs:sequence>
      <xs:element minOccurs="0" name="AgreementId" type="xs:int" />
      <xs:element minOccurs="0" name="AgreementStatus" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="AgreementType" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="AgreementVersion" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CompletedDate" type="xs:dateTime" />
      <xs:element minOccurs="0" name="ContractingEntity" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CounterpartyBranch" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CounterpartyEMID" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CounterpartyId" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CounterpartyName" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CounterpartyType" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="CreditContact" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="Products" nillable="true" type="tns:ArrayOfProduct" />
      <xs:element minOccurs="0" name="RXM" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="RequestedDate" type="xs:dateTime" />
      <xs:element minOccurs="0" name="egalEntity" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="LegalEntityCategory" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="UmbrellaCounterpartyEMID" nillable="true" type="xs:string" />
      <xs:element minOccurs="0" name="UmbrellaCounterpartyName" nillable="true" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:element name="AgreementSearchCriteria" nillable="true" type="tns:AgreementSearchCriteria" />
</xs:schema>


推荐答案

基于vauours论坛上的其他观点(inc )我们通过在2个地方修复来解决了这个问题。

Based on other views on vaiours forums(inc stack overflow) we have fixed the issue by fixing in 2 places.

更改了Delphi生成的可删除过程。以前它本身是一类输入参数,因此我们将其更改为WideString

Changed the remotable procedure generated by Delphi.Earlier it was a class of input parameter itself so we have changed to WideString

  SearchAgreements = class(TRemotable)
  private
    FsearchRequest: WideString ; 
    FsearchRequest_Specified: boolean;
    procedure SetsearchRequest(Index: Integer; const AsearchRequest: WideString ); 
    function  searchRequest_Specified(Index: Integer): boolean;
  public
    destructor Destroy; override;
  published                
    property searchRequest: WideString   Index (IS_OPTN) read FsearchRequest write SetsearchRequest stored searchRequest_Specified;
  end;

我们还修改了HTTPRIO在执行较小的修改之前,我们就能够成功地将XML发送给Service

And also we have modified HTTPRIO Before execute with minor modifications and we are able to send XML sucessfully to Service.

procedure HTTPRIO1SoapBeforeExecute(const MethodName: string;
  SOAPRequest: TStream);
var
 StrTemp,Fheader : TStringList;
  StrBeg,StrEnd,StrParam,StrParam1  : TStringList;
  StreamTemp : TStream;
  StrLst : TStringList;
  StrLstTmp: TStringList;

begin
  StrBeg:=TStringList.Create();
  StrEnd:=TStringList.Create();
  SOAPRequest.Position := 0;
  StrTemp.LoadFromStream(SOAPRequest);
  StrBeg.Text := StringReplace(StrTemp.Text,'&lt;','<',[RfReplaceAll]);
  StrEnd.Text := StringReplace(StrBeg.Text,'&gt;','>',[RfReplaceAll]);
  SOAPRequest.Position:=0;
  SOAPRequest.Size := 0; //Clear the Stream
  StrEnd.SaveToStream(SOAPRequest); //Reinitialise the stream with right string.
  SOAPRequest.Position :=0;
end;

我们已经在Webservices上进行了PHd调用,因此任何遇到类似问题的人都可以与我联系。谢谢:)

We have done PHd on Webservices call with,so anyone facing similar issue can contact me.Thanks:)

这篇关于是否可以使用Delphi ..发送和接收XML到WSDL函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆