2011-10-13 16 views
9

मैं PHP में एक साधारण साबुन वेब सेवा देशी SoapServer वर्ग का उपयोग कर बनाने के लिए कोशिश कर रहा हूँ: http://www.php.net/manual/en/class.soapserver.phpPHP 5 साबुन सर्वर का उपयोग?

हालांकि, प्रलेखन इस वर्ग पर बहुत खराब है और मैं कैसे एक सर्वर बनाने के लिए पर कोई पता नहीं है, बस एक ग्राहक है । क्या कोई कुछ टट्स या नमूना कोड प्रदान कर सकता है?

+1

2 अंक ध्यान दें कि आपको समय बचा सकता है; सबसे पहले, इस बग को समझने के लिए समय लें: https://bugs.php.net/bug.php?id=49169; दूसरा, स्कीमा सत्यापन पर भरोसा न करें, मेरे अनुभव में सभी एक्सएमएल स्कीमा नियमों की जांच नहीं की जाती है। – Robin

उत्तर

9

मैं इसके साथ भी संघर्ष कर रहा हूं, विशेष रूप से कोड प्राप्त करना जो नेट क्लाइंट के साथ अच्छी तरह से काम करता है। मुझे ऐसे उदाहरण मिल गए हैं जो PHP क्लाइंट के साथ अच्छी तरह से काम करते हैं, लेकिन जब मैं .NET क्लाइंट से सेवा को कॉल करने का प्रयास करता हूं तो अक्सर ये उदाहरण विफल हो जाते हैं। मैं अभी भी इस के साथ संघर्ष कर रहा हूँ इसलिए एक सरल पीएचपी SoapServer उदाहरण है कि एक स्ट्रिंग मान देता है के साथ मदद के लिए पूछ मेरा यह प्रश्न:,

String values returned by PHP SoapServer not received by .Net client

लेकिन हालांकि मैं इस बुनियादी उदाहरण काम नहीं कर प्राप्त कर सकते हैं, मैं एक उदाहरण प्राप्त करने में कामयाब रहा है जो कस्टम ऑब्जेक्ट की एक सरणी देता है, इसलिए मैं इस उदाहरण को उम्मीद में साझा करूंगा कि यह दूसरों के लिए सहायक होगा। यह उदाहरण एक ऑपरेशन getUsers परिभाषित करता है जो स्ट्रिंग पैरामीटर संदेश लेता है, बस संदेश पास करने का प्रदर्शन करने के लिए। यह ऑपरेशन उपयोगकर्ता ऑब्जेक्ट्स की एक सरणी देता है। उपयोगकर्ता ऑब्जेक्ट में फ़ील्ड संदेश है जहां मैं परीक्षण उद्देश्यों के लिए सेवा में प्राप्त मूल्य को वापस पास करता हूं। मैं पूरा उदाहरण पोस्ट करूंगा; wsdl दस्तावेज़, PHP सर्वर कोड और सी # क्लाइंट कोड।

WSDL दस्तावेज़

<?xml version="1.0" encoding="UTF-8"?> 
<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://test-uri/soap/export/" 
    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://test-uri/soap/export/" 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 

<wsdl:types> 
<s:schema targetNamespace="http://test-uri/soap/export/" elementFormDefault="qualified"> 
    <s:import namespace="http://microsoft.com/wsdl/types/"/> 

    <s:element name="getUsers"> 
     <s:complexType> 
      <s:sequence> 
       <s:element minOccurs="1" maxOccurs="1" name="message" type="s:string"/> 
      </s:sequence> 
     </s:complexType> 
    </s:element> 

    <s:element name="getUsersResponse"> 
     <s:complexType> 
      <s:sequence> 
       <s:element name="getUsersArray" type="tns:getUsersArray"/> 
      </s:sequence> 
     </s:complexType> 
    </s:element> 

    <s:complexType name="getUsersArray"> 
     <s:sequence> 
      <s:element minOccurs="0" maxOccurs="unbounded" name="User" nillable="true" type="tns:User" /> 
     </s:sequence> 
    </s:complexType> 

    <s:complexType name="User"> 
     <s:sequence> 
      <s:element minOccurs="1" maxOccurs="1" name="id" type="s:string"/> 
      <s:element minOccurs="1" maxOccurs="1" name="firstname" type="s:string"/> 
      <s:element minOccurs="1" maxOccurs="1" name="surname" type="s:string"/> 
      <s:element minOccurs="1" maxOccurs="1" name="message" type="s:string"/> 
     </s:sequence> 
    </s:complexType> 
</s:schema> 
</wsdl:types> 

<wsdl:message name="getUsersSoapIn"> 
<wsdl:part name="parameters" element="tns:getUsers"/> 
</wsdl:message> 
<wsdl:message name="getUsersSoapOut"> 
<wsdl:part name="parameters" element="tns:getUsersResponse"/> 
</wsdl:message> 

<wsdl:portType name="TestSoap"> 
<wsdl:operation name="getUsers"> 
    <wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'> 
     Function ("getUsers") 
    </wsdl:documentation> 
    <wsdl:input message="tns:getUsersSoapIn"/> 
    <wsdl:output message="tns:getUsersSoapOut"/> 
</wsdl:operation> 
</wsdl:portType> 

<wsdl:portType name="TestSoap12"> 
<wsdl:operation name="getUsers"> 
    <wsdl:documentation xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'> 
     Function ("getUsers") 
    </wsdl:documentation> 
    <wsdl:input message="tns:getUsersSoapIn"/> 
    <wsdl:output message="tns:getUsersSoapOut"/> 
</wsdl:operation> 
</wsdl:portType> 

<wsdl:binding name="TestSoap" type="tns:TestSoap"> 
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
<wsdl:operation name="getUsers"> 
    <soap:operation soapAction="http://test-uri/soap/export/getUsers" style="document"/> 
    <wsdl:input> 
     <soap:body use="literal"/> 
    </wsdl:input> 
    <wsdl:output> 
     <soap:body use="literal"/> 
    </wsdl:output> 
</wsdl:operation> 
</wsdl:binding> 

<wsdl:binding name="TestSoap12" type="tns:TestSoap12"> 
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
<wsdl:operation name="getUsers"> 
    <soap12:operation soapAction="http://test-uri/soap/export/getUsers" style="document"/> 
    <wsdl:input> 
     <soap12:body use="literal"/> 
    </wsdl:input> 
    <wsdl:output> 
     <soap12:body use="literal"/> 
    </wsdl:output> 
</wsdl:operation> 
</wsdl:binding> 

<wsdl:service name="TestService"> 
<wsdl:port name="TestPort" binding="tns:TestSoap"> 
    <soap:address location="http://url/to/test_server.php"/> 
</wsdl:port> 
<wsdl:port name="TestSoap12" binding="tns:TestSoap12"> 
    <soap12:address location="http://url/to/test_server.php"/> 
</wsdl:port> 
</wsdl:service> 

</wsdl:definitions> 

पीएचपी सर्वर कोड

<?php 
function getUsers($args) { 
    $args = (array)$args; 
    return array("getUsersArray" => array( 
             array("id"=>"1", 
              "firstname"=>"Barney", 
              "surname"=>"Rubble", 
              "message"=>$args["message"]), 
             array("id"=>"2", 
              "firstname"=>"Fred", 
              "surname"=>"Flintstone", 
              "message"=>$args["message"]) 
            ) 
       ); 
} 
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache 
$server = new SoapServer("test.wsdl"); 
$server->addFunction("getUsers"); 
try { 
    $server->handle(); 
} 
catch (Exception $e) { 
    $server->fault('Sender', $e->getMessage()); 
} 
?> 

सी # क्लाइंट कोड

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      WebReference.TestService srv = new WebReference.TestService(); 
      WebReference.User[] users = srv.getUsers("says hello"); 
      foreach (WebReference.User user in users) 
      { 
       MessageBox.Show(user.firstname+" "+user.message); 
      } 
     } 
    } 
} 

यह है कि। मुझे उम्मीद है कि यह उदाहरण दूसरों के लिए उपयोगी है और उन्हें उन घंटों को बचाता है जिनके लिए मुझे लागत है !!

+0

बस इस पर अनुवर्ती करने के लिए। मैं एक PHP साबुन सेवा के साथ काम करने का एक उदाहरण प्राप्त करने में भी कामयाब रहा जो एक सरणी के बजाय * एकल * ऑब्जेक्ट देता है। WSDL से _getUsersArray_ _complexType_ निकालें और इस जटिल प्रकार के संदर्भ को इसके बजाय _User_ के साथ बदलें। फिर सर्वर कोड में, उपयोगकर्ता फ़ील्ड और रैपिंग सरणी की सरणी में से एक से छुटकारा पाएं। तो इस तरह: वापसी सरणी ("getUsersArray" => सरणी ("आईडी" => "1", "firstname" => "बार्नी", "उपनाम" => "रूबल", "संदेश" => $ args [" संदेश"])); जाहिर है, _getUsersArray_ को एक और उचित नाम में बदला जा सकता है; बस डब्लूएसडीएल में भी बदलें। – BruceHill

2

यह मानते हुए कि आप PHP सर्वर कार्यों के डबल्यूएसडीएल सूची मुझे लगता है कि इस लिंक पर ट्यूटोरियल एकदम सही है प्रदान करना चाहते हैं: php servers

यह सरल, कम है और सब कुछ है कि आप की जरूरत कहते हैं।

... सरल सर्वर बनाने के बाद, केवल एक चीज है कि आप शायद के साथ समस्याओं होगा रहे हैं "जटिल प्रकार", और इस ट्यूटोरियल "नए SoapParam" का उपयोग कर की अनुशंसा करने से मुख्य समस्या का हल। PHP द्वारा लौटे एसोसिएटिव सरणी कुछ जावा/एएसपी क्लाइंट जेनरेटर में लक्षित उद्देश्यों का उत्पादन करेंगे।

तो, PHP सोप सर्वर phpclients, C# -asp, जावा-अक्ष, सोपूआई के लिए ठीक रहेगा ... php SoapServer के साथ मैन्युअल रूप से लिखा wsdl महान काम करता है।

मुझे नहीं पता क्यों, लेकिन ऐसा लगता है कि नेट पर इस बारे में जानकारी की कमी है ... "आरपीसी-एन्कोडेड के बजाय दस्तावेज़-शाब्दिक का उपयोग करें" कह रही है कि यह बेवकूफ, अप्रमाणित है या शुरुआत के लिए कम से कम महत्वहीन।

+0

लिंक टूटा हुआ है। – whoan

संबंधित मुद्दे