¿Cómo capturar los datos del XML contenido de una solicitud SOAP en php SOAPServer?

StackOverflow https://stackoverflow.com//questions/12692797

  •  12-12-2019
  •  | 
  •  

Pregunta

Estoy tratando de configurar un servicio SOAP en php.Yo he declarado un servidor php function y soy capaz de llamar a esa función con un JABÓN tipo de petición http, donde el contenido es de mi envoltura SOAP.

El contenido XML del cuerpo SOAP es el argumento de la función supongo, pero no sé cómo acceder a la información en mi código php.

Me di cuenta de que el argumento de la función es una instancia de stdClass de forma predeterminada, y de hecho, me pregunto por qué no convertir en un XML o DOM objeto php - es una llamada SOAP ¿no?Pero bien, ahora le toca a mí para obtener la información del objeto, que no es fácil porque no hay métodos asignado a stdClass, por lo que tendrá que ser la norma de las funciones de php.Así que he intentado serialize, pero esto me dio algo de basura, no la cadena XML que me esperaba.

Qué hacer?

EDITAR

tenga en cuenta que por debajo no tiene ningún código de ejemplo de lo que quiero hacer - obtener algunos datos de detalle del contenido XML de la solicitud SOAP - porque no sé cómo el código de conseguir que desde el stdClass object

A petición de david, he aquí algunos detalles.

código php:

<?php
    function mi102($arg) {
        $txt = serialize ($arg);
        $result = new SoapVar ($txt, XSD_ANYXML);
        return($result);
    }
    ini_set( "soap.wsdl_cache_enabled", "0");
    $server = new SoapServer ("test.wsdl");
    $server -> addFunction ("mi102");
    try {
        $server -> handle();
    }
    catch (Exception $e) {
        $server -> fault ('Client', $e -> getMessage());
    }
?php>

solicitud http se construye una aplicación que yo uso;el encabezado http y soap envelope + cuerpo se generan en todo el XML me alimento de ti:

JABÓN del cuerpo de solicitud de contenido:

<mi102 xmlns="http://pse">
  <cdhead cisprik="21"/>
  <instr>
    <insid>
      <bcdt>20120930</bcdt>
    </insid>
  </instr>
</mi102>

El WSDL utilizado es el siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://pse/" xmlns:xs="http://www.w3.org/2001/XMLSchema" name="PSE" targetNamespace="http://pse/">
    <types>
        <xs:schema>
            <xs:import namespace="http://pse/" schemaLocation="PSE.xsd"/>
        </xs:schema>
    </types>
    <message name="MI102Req">
        <part name="cdhead" type="tns:cdhead_T"/>
        <part name="instr" type="tns:instr_T"/>
    </message>
    <message name="Res">
        <part name="cdhead" type="tns:cdhead_T"/>
    </message>
    <portType name="MIPortType">
        <operation name="mi102">
            <input message="tns:MI102Req"/>
            <output message="tns:Res"/>
        </operation>
    </portType>
    <binding name="MIBinding" type="tns:MIPortType">
        <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="mi102">
            <soap:operation soapAction="http://testServerURL/test_soap.php#mi102"/>
            <input>
                <soap:body use="literal" namespace="http://pse/"/>
            </input>
            <output>
                <soap:body use="literal" namespace="http://pse/"/>
            </output>
        </operation>
    </binding>
    <service name="PSE">
        <port name="MIPortType" binding="tns:MIBinding">
            <soap:address location="http://testServerURL/test_soap.php"/>
        </port>
    </service>
</definitions>

Y el XML resultante (de nuevo, extraído de el JABÓN del cuerpo por la aplicación que yo uso), es

Respuesta SOAP:

<?xml version="1.0" encoding="UTF-8"?>
<ns1:mi102Response xmlns:ns1="http://pse/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">O:8:"stdClass":2:{s:7:"cisprik";i:21;s:7:"version";s:2:"13";}</ns1:mi102Response>

No es agradable.

¿Fue útil?

Solución

Finalmente he encontrado la respuesta en otros hilos de MODO que, como get-recibido-xml-de-php-jabón-servidor

La solución es utilizar la siguiente:

$inp = file_get_contents ('php://input');

Nota:No pude encontrar ninguna función que puede actuar en el stdClass argumento de entrada y puede recuperar el XML SOAP Cuerpo de contenidos de la misma.
Así que la mejor opción es utilizar el estándar de php variable de entrada.Tenga en cuenta que este tiene la siguiente estructura: Envelope/Body/..inputXML.., que es el exacto contenido de la solicitud http que se envía al servidor.

Nota: http_get_request_body puede trabajar demasiado, pero mi php servidor no admite esta función.Creo que file_get_contents se admite en todos los php del servidor de alguna versión en adelante.

Otros consejos

Esto no empieza como una respuesta completa, pero yo quería el formato.Sírvanse explicar en detalle lo que usted ha configurado.Generalmente, usted tendrá un método PHP con los argumentos regulares (no XML) que desea exponer como un servicio web.Un ejemplo básico de cómo hacerlo aquí:

http://www.phpeveryday.com/articles/Web-Services-WSDL-Creating-SOAP-Server-P484.html

El contenido XML del cuerpo SOAP es el argumento de la función que asume

No, el contenido XML del cuerpo SOAP es el representación el método con tus argumentos, pero sus argumentos son lo que usted desea.Usted no debería tener que lidiar con XML manualmente si la configuración del PHP SoapServer y SoapClient.

EDITAR:Usted está tomando su argumento, que es un simple array de PHP representación de su solicitud SOAP del cuerpo, serializar y se envía de vuelta como una respuesta (que es lo que se observa).Es esto lo que quieres hacer?No quieres hacer algo con los datos de la solicitud?También, usted puede publicar el esquema que se importan desde el WSDL?

Usted está teniendo que "no es agradable" la representación de un objeto porque el que devuelve el objeto serializado(Serialización es el de convertir el objeto y su estado a una representación de cadena de caracteres).Si usted quiere tener una representación xml del objeto devuelto debe cambiar su función del tipo de parámetro devuelto a un objeto.Porque ahora es devolver una cadena.

Yo recomendaría el uso de la Zend_Soap_Server y Zend_Soap_Autodiscover componentes de zend framework.

Con Zend_Soap_Autodiscover puede generar su definición de servicio web (wsdl) de forma dinámica , sólo por la escritura de los bloques de documentación de sus funciones.Y Zend_Soap_Server es bastante fresco.

Si se utilizan estos componentes y documentar sus tipos y su función para devolver un tipo específico sin registrar, entonces usted va a recibir el xml represention de acuerdo a la definición wsdl.También cada tipo de crear se convierte automáticamente por Zend_Soap_Autodiscover a un ComplexType en el wsdl generado.

Ejemplo:

 public class Person{
         public $id;
         public $name;
    }

    public class MyService {
     /**
     *
     * @param integer $UserID
     * @return Person
     */
    function mi102($UserID) {

         $output = new Person();
         $output->id = 2;
         $output->name = 'Peter';        

        return $output;
    }
}


// Generate WSDL relevant to code
if (isset($_GET['wsdl'])){

    $autodiscover = new Zend_Soap_AutoDiscover();
    $autodiscover->setClass('MyService');
    $autodiscover->handle();

} else {

    $server = new Zend_Soap_Server($serviceURL . "?wsdl");
    $server->setClass('MyService');
    $server->setObject(new MyService());
    $server->handle();

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top