2016-06-18 5 views
1

Ich möchte PHP SOAP Server erstellen, aber nicht verstehen, wie es richtig geht. So unten ist die server.php Datei:Wie erstellt PHP SOAP Server Funktionen mit WSDL?

<?php 

class NewOperation { 
    public function NewOperation() 
    { 

    } 
} 

ini_set("soap.wsdl_cache_enabled", "0"); 
$server = new SOAPServer('http://localhost:9080/soap-websiteservice-  wsdl/CalculatorService.wsdl', array(
    'soap_version' => SOAP_1_2, 
    'style' => SOAP_RPC, 
    'use' => SOAP_LITERAL 
)); 
$server->setClass('NewOperation'); 
$server->handle(); 

Die client.php Datei:

<?php 
// client.php 
$options = array(
    'trace' => true 
); 
$client = new SOAPClient('http://localhost:9080/soap-websiteservice- wsdl/server.php?wsdl', $options); 
var_dump($client->NewOperation()); 

Die WSDL-Datei:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"  xmlns:tns="http://localhost:9080/soap-websiteservice-wsdl/CalculatorService/"  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CalculatorService"  targetNamespace="http://localhost:9080/soap-websiteservice- wsdl/CalculatorService/"> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://localhost:9080/soap-websiteservice- wsdl/CalculatorService/"> 
     <xsd:element name="add" type="xsd:string"> 

     </xsd:element> 
    <xsd:element name="addResponse"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="addResponse" type="tns:addResponseType" /> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:complexType name="addRequestType"> 
    <xsd:sequence> 
     <xsd:element name="num1" type="xsd:int"></xsd:element> 
     <xsd:element name="num2" type="xsd:int"></xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="addResponseType"> 
    <xsd:sequence> 
     <xsd:element name="result" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
    </xsd:complexType> 
     <xsd:element name="in" type="xsd:string"></xsd:element> 
     <xsd:element name="NewOperationResponse"> 
      <xsd:complexType> 
       <xsd:sequence> 
        <xsd:element name="out" type="xsd:string"></xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
     </xsd:element> 
</xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="addRequest"> 
<wsdl:part element="tns:add" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="addResponse"> 
<wsdl:part element="tns:addResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="NewOperationRequest"> 
<wsdl:part name="NewOperationRequest" element="tns:in"></wsdl:part> 
    </wsdl:message> 
    <wsdl:message name="NewOperationResponse"> 
    <wsdl:part name="parameters" element="tns:NewOperationResponse">  </wsdl:part> 
    </wsdl:message> 
<wsdl:portType name="CalculatorService"> 

<wsdl:operation name="NewOperation"> 
    <wsdl:input message="tns:NewOperationRequest"></wsdl:input> 
    <wsdl:output message="tns:NewOperationResponse"></wsdl:output> 
</wsdl:operation> 
</wsdl:portType> 
<wsdl:binding name="CalculatorServiceSOAP" 
type="tns:CalculatorService"> 
<soap:binding style="document" 
    transport="http://schemas.xmlsoap.org/soap/http" /> 
<wsdl:operation name="NewOperation"> 
    <soap:operation 
     soapAction="http://localhost:9080/soap-websiteservice-  wsdl/CalculatorService/NewOperation" /> 
    <wsdl:input> 
     <soap:body use="literal" /> 
    </wsdl:input> 
    <wsdl:output> 
     <soap:body use="literal" /> 
    </wsdl:output> 
</wsdl:operation> 
</wsdl:binding> 
<wsdl:service name="CalculatorService"> 
<wsdl:port binding="tns:CalculatorServiceSOAP" name="CalculatorServiceSOAP"> 
    <soap:address location="http://localhost:9080/soap-websiteservice-wsdl/"/> 
</wsdl:port> 
</wsdl:service> 
</wsdl:definitions> 

Image from eclipse

Zipped all files

Ich erstellte WSDL-Datei mit Eclipse-Web-Service-XML-Editor. Jetzt weiß ich nicht, wie man Funktionen erstellt. Ich erhalte die folgende Fehlermeldung:

Fatal error: Uncaught SoapFault exception: [HTTP] Not Found in C:\wamp\www\soap-websiteservice-wsdl\client.php:7 Stack trace: #0 [internal function]: SoapClient->__doRequest('http://localhos...', ' http://localhos ...', 1, 0) #1 C:\wamp\www\soap-websiteservice-wsdl\client.php(7): SoapClient->__call('NewOperation', Array) #2 C:\wamp\www\soap-websiteservice-wsdl\client.php(7): SoapClient->NewOperation() #3 {main} thrown in C:\wamp\www\soap-websiteservice-wsdl\client.php on line 7

Antwort

0

Schließlich ich herausfinden, wie es funktioniert ist.

Jetzt in Eclipse meine Wsdl wie folgt aussieht: enter image description here

Und Calculator.wsdl:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost:9080/soap-websiteservice-wsdl/Calculator" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="Calculator" targetNamespace="http://localhost:9080/soap-websiteservice-wsdl/Calculator"> 
    <wsdl:types> 
    <xsd:schema targetNamespace="http://localhost:9080/soap-websiteservice-wsdl/Calculator"> 
     <xsd:element name="Average"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="num1" type="xsd:int" /> 
      <xsd:element name="num2" type="xsd:int"></xsd:element> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 
     <xsd:element name="AverageResponse"> 
     <xsd:complexType> 
      <xsd:sequence> 
      <xsd:element name="Result" type="xsd:string"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     </xsd:element> 

     <xsd:complexType name="AverageRequestType"> 
     <xsd:sequence> 
      <xsd:element name="num1" type="xsd:int"></xsd:element> 
      <xsd:element name="num2" type="xsd:int"></xsd:element> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </wsdl:types> 
    <wsdl:message name="AverageRequest"> 
    <wsdl:part element="tns:Average" name="parameters"/> 
    </wsdl:message> 
    <wsdl:message name="AverageResponse"> 
    <wsdl:part element="tns:AverageResponse" name="parameters"/> 
    </wsdl:message> 
    <wsdl:portType name="Calculator"> 
    <wsdl:operation name="Average"> 
     <wsdl:input message="tns:AverageRequest"/> 
     <wsdl:output message="tns:AverageResponse"/> 
    </wsdl:operation> 
    </wsdl:portType> 
    <wsdl:binding name="CalculatorSOAP" type="tns:Calculator"> 
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
    <wsdl:operation name="Average"> 
     <soap:operation soapAction="http://localhost:9080/soap-websiteservice-wsdl/Calculator/NewOperation"/> 
     <wsdl:input> 
     <soap:body use="literal"/> 
     </wsdl:input> 
     <wsdl:output> 
     <soap:body use="literal"/> 
     </wsdl:output> 
    </wsdl:operation> 
    </wsdl:binding> 
    <wsdl:service name="Calculator"> 
    <wsdl:port binding="tns:CalculatorSOAP" name="CalculatorSOAP"> 
     <soap:address location="http://localhost:9080/soap-websiteservice-wsdl/server.php"/> 
    </wsdl:port> 
    </wsdl:service> 
</wsdl:definitions> 

Mein server.php:

 <?php 
    ini_set("soap.wsdl_cache_enabled", "0"); 

    class Server{ 

     protected $class_name = ''; 

     public function __construct($class_name) 
     { 
      $this->class_name = $class_name; 
     } 
     public function AuthHeader($Header) 
     { 
      //if($Header->username == 'foo' && $Header->password == 'bar') 
      // $this->authenticated = true; 

     } 

     public function log($method_name,$data) 
     { 
      $filename = 'log.txt'; 
      $handle = fopen($filename, 'a+'); 
      fwrite($handle, date("l dS of F Y h:i:s A").' - '.$_SERVER['REMOTE_ADDR']."\r\n".$method_name."\r\n".print_r($data,true)); 
      fclose($handle); 
     } 

     public function __call($method_name, $parameters) 
     { 
      $this->log($method_name,$parameters); // log 
      //if($arguments[0]!=AUTH) return 'Authorization required'; // auth check 
      if(!method_exists($this->class_name, $method_name)) return 'Method '.$method_name.' not found'; // methot exist check 
      return call_user_func_array(array($this->class_name, $method_name), $parameters); //call method 
     } 
    } 


    class Calculator { 
     public function Average ($parameters) 
     { 
      $num1 = $parameters->num1; 
      $num2 = $parameters->num2; 

      return self::AverageResponse(($num1 + $num2)/2); 
     } 

     public function AverageResponse ($message) 
     { 
      return ['Result' => $message]; 
     } 
    } 

    class in { 

    } 

    $Service = new Server('Calculator'); 
    $classmap=[ 
     'in' => 'in' 
    ]; 
    $server = new SOAPServer('http://localhost:9080/soap-websiteservice-wsdl/Calculator.wsdl', array(
     'soap_version' => SOAP_1_2, 
     'style' => SOAP_RPC, 
     'use' => SOAP_LITERAL, 
     'classmap'=>$classmap 
    )); 
    $server->setObject($Service); 
    //$server->setClass('Calculator'); 
    $server->handle(); 

client.php

 <?php 
    // client.php 
    $options = array(
     'trace' => true 
    ); 
    $client = new SOAPClient('http://localhost:9080/soap-websiteservice-wsdl/server.php?wsdl', $options); 
    var_dump($client->Average(['num1' => 10, 'num2' => 6])->Result); 

Also ich habe mit Virtual Studio getestet. So habe ich das Formular erstellt: enter image description here

erstellt Web Service-Referenz: localhost. Und Ereignis meiner Schaltfläche klicken wie folgt aussieht:

 using System; 
    using System.Collections.Generic; 
    using System.ComponentModel; 
    using System.Data; 
    using System.Drawing; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    using System.Windows.Forms; 

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

      private void button1_Click(object sender, EventArgs e) 
      { 
       localhost.Calculator client = new localhost.Calculator(); 

       string returnString; 

       returnString = client.Average(10,8); 
       label1.Text = returnString; 
      } 
     } 
    } 

Endlich: enter image description here

Und endgültiger Code Test unter: https://bitbucket.org/Ernestyno/laravel-soap-server-and-client/src/51d144f41bbcc7680bb3d4a7f6e8aedcbef0cb77?at=master

i Hier teilen, wie SOAP-Server und -Client mit Laravel zu machen!

2

Probieren Sie es

Server-Objekt:

 
class Server{ 

protected $class_name = ''; 

public function __construct($class_name) 
    { 
     $this->class_name = $class_name; 
    } 
public function AuthHeader($Header) 
    { 
     //if($Header->username == 'foo' && $Header->password == 'bar') 
     // $this->authenticated = true; 

    } 

public function log($method_name,$data) 
    { 
     $filename = 'log.txt'; 
     $handle = fopen($filename, 'a+'); 
     fwrite($handle, date("l dS of F Y h:i:s A").' - '.$_SERVER['REMOTE_ADDR']."\r\n".$method_name."\r\n".print_r($data,true)); 
     fclose($handle); 
    } 

public function __call($method_name, $arguments) 
    { 
     $this->log($method_name,$arguments); // log 
     if($arguments[0]!=AUTH) return 'Authorization required'; // auth check 
     $_method_name = '_'.$method_name; // method name replace 
     if(!method_exists($this->class_name, $_method_name)) return 'Method '.$method_name.' not found'; // methot exist check 
     return call_user_func_array(array($this->class_name, $_method_name), $arguments); //call method 
    } 
} 

Es ist mein ein Arbeits Code mit Protokollierung Anfrage. Ich hatte dasselbe Problem damit.

Server:

 
$Service = new Server('YouClassHere'); 

$server->setObject($Service); 
+0

danke dafür! – Ernestyno