Estoy acostumbrado a escribir código PHP, pero a menudo no uso la codificación orientada a objetos. Ahora necesito interactuar con SOAP (como cliente) y no puedo obtener la sintaxis correcta. Tengo un archivo WSDL que me permite configurar correctamente una nueva conexión usando la clase SoapClient. Sin embargo, no puedo hacer la llamada correcta y obtener los datos devueltos. Necesito enviar los siguientes datos (simplificados):
- ID de contacto
- Nombre de contacto
- Descripción general
- Cantidad
Hay dos funciones definidas en el documento WSDL, pero solo necesito una ("Primera función" a continuación). Aquí está el script que ejecuto para obtener información sobre las funciones y tipos disponibles:
$client = new SoapClient("http://example.com/webservices?wsdl");
var_dump($client->__getFunctions());
var_dump($client->__getTypes());
Y aquí está la salida que genera:
array(
[0] => "FirstFunction Function1(FirstFunction $parameters)",
[1] => "SecondFunction Function2(SecondFunction $parameters)",
);
array(
[0] => struct Contact {
id id;
name name;
}
[1] => string "string description"
[2] => string "int amount"
}
Digamos que quiero hacer una llamada a FirstFunction con los datos:
- ID de contacto: 100
- Nombre de contacto: John
- Descripción general: Barril de petróleo
- Cantidad: 500
¿Cuál sería la sintaxis correcta? He estado probando todo tipo de opciones, pero parece que la estructura del jabón es bastante flexible, por lo que hay muchas maneras de hacerlo. No pude resolverlo del manual tampoco ...
ACTUALIZACIÓN 1: muestra probada de MMK:
$client = new SoapClient("http://example.com/webservices?wsdl");
$params = array(
"id" => 100,
"name" => "John",
"description" => "Barrel of Oil",
"amount" => 500,
);
$response = $client->__soapCall("Function1", array($params));
Pero me da esta respuesta: Object has no 'Contact' property
. Como puede ver en la salida de getTypes()
, hay un struct
llamado Contact
, así que supongo que de alguna manera necesito dejar en claro que mis parámetros incluyen los datos de contacto, pero la pregunta es: ¿cómo?
ACTUALIZACIÓN 2: También probé estas estructuras, el mismo error.
$params = array(
array(
"id" => 100,
"name" => "John",
),
"Barrel of Oil",
500,
);
Tanto como:
$params = array(
"Contact" => array(
"id" => 100,
"name" => "John",
),
"description" => "Barrel of Oil",
"amount" => 500,
);
Error en ambos casos: el objeto no tiene la propiedad 'Contacto'
También puede usar los servicios SOAP de esta manera:
Este es un ejemplo con un servicio real, y funciona.
Espero que esto ayude.
fuente
Primero inicialice los servicios web:
Luego establezca y pase los parámetros:
Tenga en cuenta que el nombre del método está disponible en WSDL como nombre de la operación, por ejemplo:
fuente
No sé por qué mi servicio web tiene la misma estructura que usted, pero no necesita Clase para el parámetro, solo es una matriz.
Por ejemplo: - Mi WSDL:
Yo var_dump:
Aquí está el resultado:
Entonces en mi código:
pero con exito!
fuente
Lee esto;-
http://php.net/manual/en/soapclient.call.php
O
Este es un buen ejemplo para la función SOAP "__call". Sin embargo, está en desuso.
fuente
Primero, usa SoapUI para crear su proyecto de jabón desde el wsdl. Intenta enviar una solicitud para jugar con las operaciones de wsdl. Observe cómo la solicitud xml compone sus campos de datos.
Y luego, si tiene problemas para que SoapClient actúe como lo desea, así es como lo depuro. Establezca la opción trace para que la función __getLastRequest () esté disponible para su uso.
Luego, la variable $ xml contiene el xml que SoapClient compone para su solicitud. Compare este xml con el generado en SoapUI.
Para mí, SoapClient parece ignorar las claves de la matriz asociativa $ params e interpretarla como una matriz indexada, lo que causa datos de parámetros incorrectos en el xml. Es decir, si vuelvo a ordenar los datos en $ params , la respuesta $ es completamente diferente:
fuente
Si crea el objeto de SoapParam, esto resolverá su problema. Cree una clase y correlacione con el tipo de objeto proporcionado por WebService, Inicialice los valores y envíe la solicitud. Vea la muestra a continuación.
fuente
Tuve el mismo problema, pero acabo de envolver los argumentos como este y funciona ahora.
Usando esta función:
Puede ver el XML de solicitud si está cambiando o no, dependiendo de sus argumentos.
Utilice [trace = 1, excepciones = 0] en las opciones de SoapClient.
fuente
Necesitas declarar contrato de clase
o
Luego
o
fuente
Necesita una matriz multidimensional, puede probar lo siguiente:
en PHP una matriz es una estructura y es muy flexible. Normalmente con llamadas de jabón, uso un contenedor XML, así que no estoy seguro de si funcionará.
EDITAR:
Lo que puede intentar es crear una consulta json para enviar o usarla para crear una compra xml, siguiendo lo que está en esta página: http://onwebdev.blogspot.com/2011/08/php-converting-rss- to-json.html
fuente
Hay una opción para generar objetos php5 con la clase WsdlInterpreter. Ver más aquí: https://github.com/gkwelding/WSDLInterpreter
por ejemplo:
fuente
getLastRequest ():
Este método solo funciona si el objeto SoapClient se creó con la opción de rastreo establecida en TRUE.
VERDADERO en este caso está representado por 1
trabajó para mi.
fuente