Проблема с WSDL

Я пытаюсь создать PHP-мыльный сервер на основе WSDL, который мне был изменен для наших целей. Я думаю, проблема возникает в виде файла WSDL. Когда я привожу его, чтобы проверить его здесь: http://www.validwsdl.com/ , ответ умирает и говорит мне, что функции нет.

Идея заключается в том, что ожидаемый ввод – это 4 элемента, эти 4 элемента будут помещены в функцию, используются и будут возвращены 4 других элемента. Я вырезал все, кроме возвращения в моем примере здесь, но идея все равно должна работать.

Это мой PHP-код:

ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache $server = new SoapServer("InventoryInquiry.wsdl"); $server->addFunction("GetInventoryStatus"); $server->handle(); function GetInventoryStatus($request) { $dealerBranch = 1;//default branch to 1 $inStock = 0;//default in stock to 0 $cantTrack = 0; //used to check if branch is tracked $estDeliveryTime = ""; $estDeliveryDate = ""; $deliveryLocation = ""; return array( 'InStock' => $inStock, 'EstDeliveryDate' =>$estDeliveryDate, 'EstDeliveryTime'=> $estDeliveryTime, 'DeliveryLocation' => $dealerBranch ); 

}

И это мой файл wsdl:

 <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://www.elennox.net/server1.php/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://www.elennox.net/server1.php" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.elennox.net/server1.php"> <s:element name="GetInventoryStatus"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="DealerCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="SupplierCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="PartNumber" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="Quantity" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetInventoryStatusResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="InStock" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryDate" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryTime" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="DeliveryLocation" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="InventoryRequestRequest"> <wsdl:part name="parameters" element="tns:GetInventoryStatus" /> </wsdl:message> <wsdl:message name="InventoryRequestResponse"> <wsdl:part name="parameters" element="tns:GetInventoryStatusResponse" /> </wsdl:message> <wsdl:portType name="InventoryStatusPortType"> <wsdl:operation name="InventoryRequest"> <wsdl:input message="tns:InventoryRequestRequest" /> <wsdl:output message="tns:InventoryRequestResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="InventoryStatusBinding" type="tns:InventoryStatusPortType"> <soap:binding style='rpc' transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="InventoryRequest"> <soap:operation soapAction="http://www.elennox.net/server1.php#InventoryStatus" style="document" /> <wsdl:input> <soap:body use="literal" namespace="urn:InventoryStatus"/> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="urn:InventoryStatus"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="InventoryStatus"> <wsdl:port name="InventoryStatusPort" binding="tns:InventoryStatusBinding"> <soap:address location="http://www.elennox.net/server1.php" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 

Я совершенно новичок в этих веб-сервисах в целом, и у меня есть время с этим. Любые советы или помощь будут очень признательны. Благодаря!

Как отметил @ghostJago, вам следует использовать стиль «document», а не «rpc» («document / literal» – предпочтительный стиль).

Но также наблюдайте за своими пространствами имен (я вижу, что вы используете urn:InventoryStatus и http://www.elennox.net/server1.php .) Которая из них?).

Я думаю, что что-то вроде этого – то, что вы ищете:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.elennox.net/server1.php" xmlns:tns="http://www.elennox.net/server1.php" name="InventoryStatusService"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.elennox.net/server1.php"> <s:element name="GetInventoryStatus"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="DealerCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="SupplierCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="PartNumber" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="Quantity" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetInventoryStatusResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="InStock" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryDate" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryTime" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="DeliveryLocation" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="InventoryRequestRequest"> <wsdl:part name="parameters" element="tns:GetInventoryStatus" /> </wsdl:message> <wsdl:message name="InventoryRequestResponse"> <wsdl:part name="parameters" element="tns:GetInventoryStatusResponse" /> </wsdl:message> <wsdl:portType name="InventoryStatusPortType"> <wsdl:operation name="InventoryRequest"> <wsdl:input message="tns:InventoryRequestRequest" /> <wsdl:output message="tns:InventoryRequestResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="InventoryStatusBinding" type="tns:InventoryStatusPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="InventoryRequest"> <soap:operation soapAction="http://www.elennox.net/server1.php#InventoryStatus" 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="InventoryStatus"> <wsdl:port name="InventoryStatusPort" binding="tns:InventoryStatusBinding"> <soap:address location="http://www.elennox.net/server1.php" /> </wsdl:port> </wsdl:service> </wsdl:definitions> пространство <?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:s="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.elennox.net/server1.php" xmlns:tns="http://www.elennox.net/server1.php" name="InventoryStatusService"> <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.elennox.net/server1.php"> <s:element name="GetInventoryStatus"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="DealerCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="SupplierCode" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="PartNumber" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="Quantity" type="s:int" /> </s:sequence> </s:complexType> </s:element> <s:element name="GetInventoryStatusResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="InStock" type="s:int" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryDate" type="s:string" /> <s:element minOccurs="0" maxOccurs="1" name="EstDeliveryTime" type="s:string" /> <s:element minOccurs="1" maxOccurs="1" name="DeliveryLocation" type="s:string" /> </s:sequence> </s:complexType> </s:element> </s:schema> </wsdl:types> <wsdl:message name="InventoryRequestRequest"> <wsdl:part name="parameters" element="tns:GetInventoryStatus" /> </wsdl:message> <wsdl:message name="InventoryRequestResponse"> <wsdl:part name="parameters" element="tns:GetInventoryStatusResponse" /> </wsdl:message> <wsdl:portType name="InventoryStatusPortType"> <wsdl:operation name="InventoryRequest"> <wsdl:input message="tns:InventoryRequestRequest" /> <wsdl:output message="tns:InventoryRequestResponse" /> </wsdl:operation> </wsdl:portType> <wsdl:binding name="InventoryStatusBinding" type="tns:InventoryStatusPortType"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="InventoryRequest"> <soap:operation soapAction="http://www.elennox.net/server1.php#InventoryStatus" 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="InventoryStatus"> <wsdl:port name="InventoryStatusPort" binding="tns:InventoryStatusBinding"> <soap:address location="http://www.elennox.net/server1.php" /> </wsdl:port> </wsdl:service> </wsdl:definitions> 

Это приведет к следующему запросу / ответу:

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://www.elennox.net/server1.php"> <soapenv:Body> <ser:GetInventoryStatus> <!--Optional:--> <ser:DealerCode>...</ser:DealerCode> <!--Optional:--> <ser:SupplierCode>...</ser:SupplierCode> <!--Optional:--> <ser:PartNumber>...</ser:PartNumber> <ser:Quantity>...</ser:Quantity> </ser:GetInventoryStatus> </soapenv:Body> </soapenv:Envelope> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://www.elennox.net/server1.php"> <soapenv:Body> <ser:GetInventoryStatusResponse> <!--Optional:--> <ser:InStock>...</ser:InStock> <!--Optional:--> <ser:EstDeliveryDate>...</ser:EstDeliveryDate> <!--Optional:--> <ser:EstDeliveryTime>...</ser:EstDeliveryTime> <ser:DeliveryLocation>...</ser:DeliveryLocation> </ser:GetInventoryStatusResponse> </soapenv:Body> </soapenv:Envelope> 

Кроме того, это хороший этикет: D объявить ошибки вашей операции (которая будет содержать детали в случае, если что-то пойдет не так).

Удачи!

попробуйте изменить оба атрибута стиля на одно и то же значение, поэтому

 <soap:binding style='document' transport="http://schemas.xmlsoap.org/soap/http" /> 

Вы можете использовать любой документ или rpc для стиля. Эта ссылка описывает различные методы для сочетаний стиля и использования:

Какой стиль WSDL я должен использовать

Его довольно техничный, хотя, надеюсь, установка ссылок на стиль для одного и того же значения должна сортировать вашу проблему. Раньше я действительно использовал только документ / литерал или rpc / encoded .