Ben Axis2 'açıkta' türleri ile bir WSDL oluşturmak yapabilir miyim?

2 Cevap php

Ben bir PHP istemci kullanarak bir merhaba dünya axis2 SOAP web hizmeti tüketmeye çalışıyorum. Java sınıf NetBeans yazılır ve axis2 aar dosya Netbeans axis2 eklentisi kullanarak oluşturulur.

Hepsini daha önce gördüm ama burada java sınıfı bulunuyor:

public class SOAPHello {    
    public String sayHello(String username) {
        return "Hello, "+username;
    }  
}

Axis2 tarafından genereated wsdl ben hizmet tüketmek ben böyle çılgın bir PHP komut dosyası kullanmak zorunda, böylece tüm parametreleri sarmak gibi görünüyor:

$client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
$parameters["username"] = "Dave";
$response = $client->sayHello($parameters)->return;
echo $response."!";

Gerçekten yapmak istediğiniz tüm olduğunda

   echo $client->sayHello("Dave")."!";

Benim soru iki yönlüdür: bu neden oluyor? ve ben bunu durdurmak için ne yapabilirim? :)

İşte en oluşturulan WSDL türleri, mesaj ve PortType bölümler:

<wsdl:types>
   <xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://soap.axis2.myhost.co.uk">
      <xs:element name="sayHello">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="username" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
      <xs:element name="sayHelloResponse">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="return" nillable="true" type="xs:string"/>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
   </xs:schema>
</wsdl:types>

<wsdl:message name="sayHelloRequest">
   <wsdl:part name="parameters" element="ns:sayHello"/>
</wsdl:message>    
<wsdl:message name="sayHelloResponse">
   <wsdl:part name="parameters" element="ns:sayHelloResponse"/>
</wsdl:message>

<wsdl:portType name="SOAPHelloPortType">
   <wsdl:operation name="sayHello">
      <wsdl:input message="ns:sayHelloRequest" wsaw:Action="urn:sayHello"/>
      <wsdl:output message="ns:sayHelloResponse" wsaw:Action="urn:sayHelloResponse"/>
   </wsdl:operation>
</wsdl:portType>

2 Cevap

Ben aynı soru arıyordu ve bir çözüm bulamadık. Bu i çok okunmaz bulmak berbat arayüzü bu tür oluşturmak için axis2 felsefesinin bir tür gibi seemes. Ama çoğu amaç için sadece bunu kabul edeceğini düşünüyorum. Bu gibi ve uygulama webservice çok kullanmak istemiyorsanız, o zaman böyle bir sarıcı sınıf yazmak:

class soapHelloWebservice {
   public function sayHello($username) {
      $client = new SoapClient("http://myhost:8080/axis2/services/SOAPHello?wsdl");
      $parameters["username"] = $username;
      return $client->sayHello($parameters)->return;
   } 
}

Bu belge / literal sarılır desen denir. Bkz this document ve this one.

Belge / literal istek kodlamasının kullanırken Temelde, müşteri mutlaka çağırıyor web hizmeti operasyonun adını göndermez. Sunucu isteği nesneden onu anlamaya vardır. Sunucu bunu sağlamak için, farklı bir istek nesnesi her web servis işlemi için tanımlanır.