Foros del Web » Programando para Internet » PHP »

Petición SOAP por HTTP

Estas en el tema de Petición SOAP por HTTP en el foro de PHP en Foros del Web. Estoy intentando hacer una peticion SOAP por HTTP, alguién sabría darme algún ejemplo de cómo se hace? hay que utilizar formularios? Este es el formato ...
  #1 (permalink)  
Antiguo 16/03/2009, 09:40
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Petición SOAP por HTTP

Estoy intentando hacer una peticion SOAP por HTTP, alguién sabría darme algún ejemplo de cómo se hace? hay que utilizar formularios?

Este es el formato de un tipo de petición

alguien sabe como enviar una peticion soap por http y php?

Esta es la request que espera el servidor:

POST /webservice/JP_ZoneList.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3053)
Content-Type: text/xml; charset=utf-8
SOAPAction: "--"
Host: xml.bookingengine.es
Content-Length: 502
Expect: 100-continue

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="--" xmlns:xsi="--"
xmlns:xsd="--">
<soap:Body>
<JP_ZoneListService xmlns="--">
<JP_ZoneListRQ PrimaryLangID="en">
<POS>
<Source AgentDutyCode="***">
<RequestorID MessagePassword="***"/>
</Source>
</POS>
</JP_ZoneListRQ>
</JP_ZoneListService>
</soap:Body>
</soap:Envelope>


Muchas gracias.
  #2 (permalink)  
Antiguo 16/03/2009, 09:52
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Hola Sonaoao,

Le sobre la extensión SOAP. Ahí puedes ver ejemplos y toda la documentación al respecto.

Saludos
  #3 (permalink)  
Antiguo 16/03/2009, 10:09
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Sí, ya le eché un vistazo, pero esta clase es para hacer peticiones si el cliente tiene ya creadas funciones de petición en su servidor y este no es el caso. Corrígeme si me equivoco en algo.

Creo que lo que necesito es enviar el cabecero del soap y el xml correspondiente a la petición por HTTP, pero no sé aún cómo... supongo que será algo parecido a la funcion mail() o envío de cabeceros como si fuera un formulario.

No sé, estoy perdido.

Necesito un poquito de luz...

tendrá algo que ve la función XMLHttpRequest????

Última edición por GatorV; 16/03/2009 a las 11:01
  #4 (permalink)  
Antiguo 16/03/2009, 11:00
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Sirve exactamente para lo que necesitas, creas el objeto SOAP y pasas el parámetro que necesitas, si ves el cuerpo del mensaje de tu ejemplo es un XML, pero es un XML del tipo SOAP que tienes que llamar desde la clase SOAP.

Saludos.
  #5 (permalink)  
Antiguo 16/03/2009, 11:40
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

OK.

LLamo a la funcion:

$client = new SoapClient("--HotelAvail.asmx?wsdl");


$client->funcion($a, $b, $c);

Pero, ¿cuál es la función y los parametros que espera la función?????

Seguro que no espera un xml????

¿Cómo se por ejemplo que funcion tengo que utilizar para una peticion como esta?:

POST /webservice/OTA_HotelAvail.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client Protocol 2.0.50727.3053)
Content-Type: text/xml; charset=utf-8
SOAPAction: "--"
Host: xml.bookingengine.es
Content-Length: 1075
Expect: 100-continue

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="--"
xmlns:xsi="--"
xmlns:xsd="--">
<soap:Body>
<OTA_HotelAvailService xmlns="--">
<OTA_HotelAvailRQ PrimaryLangID="en">
<POS>
<Source AgentDutyCode="***">
<RequestorID MessagePassword="***"/>
</Source>
</POS>
<AvailRequestSegments>
<AvailRequestSegment>
<StayDateRange Start="2009-02-13T00:00:00" End="2009-02-14T00:00:00"/>
<RoomStayCandidates>
<RoomStayCandidate Quantity="1">
<GuestCounts>
<GuestCount Age="40" Count="1"/>
<GuestCount Age="40" Count="1"/>
</GuestCounts>
</RoomStayCandidate>
</RoomStayCandidates>
<HotelSearchCriteria>
<Criterion>
<HotelRef HotelCityCode="35424"/>
<TPA_Extensions>
<ShowBasicInfo xmlns="">1</ShowBasicInfo>
<ShowPromotions xmlns="">1</ShowPromotions>
</TPA_Extensions>
</Criterion>
</HotelSearchCriteria>
</AvailRequestSegment>
</AvailRequestSegments>
</OTA_HotelAvailRQ>
</OTA_HotelAvailService>
</soap:Body>
</soap:Envelope>

Toy perdidísimo es mi primera vez con SOAP... ya me iba directamente a rayarme con xmlhttprequest...

Muchas gracias por tus respuestas GatorV.
  #6 (permalink)  
Antiguo 16/03/2009, 14:59
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Pues al parecer sin ver la documentación de tu webService el método a llamar es OTA_HotelAvailService, y acepta un objeto complejo con muchas variables como guestAccounts, Hotels, etc.

Eso ya lo tienes que ver con la persona que te da el servicio del WebService.

Saludos.
  #7 (permalink)  
Antiguo 17/03/2009, 02:24
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

En el webservices esperan las petición SOAP pasada por HTTP, no esperan ninguna petición pasando variables de hecho no tienen métodos para ser llamados por funciones soap de php. Esperan directamente el XML con las cabeceras SOAP, este es el problema.

A mi me da que va a ser con XMLHTTPREQUEST...

Alguien sabe algo más?
  #8 (permalink)  
Antiguo 17/03/2009, 16:01
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Precisamente, SOAP hace el request vía HTTP, pero lo hace transparente para que tu solo levantes al cliente y envies el request, no tienes que hacer cosas más complejas.

Saludos.
  #9 (permalink)  
Antiguo 19/03/2009, 06:01
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

Ya va, así lo he hecho:

$strXml = "<JP_ZoneListService xmlns='---'>
<JP_ZoneListRQ PrimaryLangID=\"" .$lang_code. "\">
<POS>
<Source AgentDutyCode='***'>
<RequestorID Type='1' MessagePassword='***' />
</Source>
</POS>
</JP_ZoneListRQ>
</JP_ZoneListService>";


$client = new nusoap_client('---.asmx?WSDL', 'wsdl');

$result = $client->call('JP_ZoneListService', $strXml);

$respuesta = $client->response;

Para ver el xml hago:
echo "<xmp>".$respuesta."</xmp>";

Pero lo que devuelve $result es un array, con que debo de trabajar con el array o con el xml???

a ver, a ver vamos pa lante...
  #10 (permalink)  
Antiguo 19/03/2009, 08:02
Avatar de farra  
Fecha de Ingreso: marzo-2008
Ubicación: Aqui estoy
Mensajes: 574
Antigüedad: 16 años, 1 mes
Puntos: 20
Respuesta: Petición SOAP por HTTP

yo tengo el mismo problema que vos aca:
http://www.forosdelweb.com/f18/conec...action-678482/

si logras solucionarlo avisame, hace rato que trato y todavia no consigo...
__________________
Firma:
Es mas dificil para el mono entender que el hombre desciende de el....

PD: Siempre doy karma al que me da una buena respuesta... ;0)
  #11 (permalink)  
Antiguo 19/03/2009, 09:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Haz un var_dump($result) y vas a poder ver la cadena del resultado (ya que no es un string).

Saludos.
  #12 (permalink)  
Antiguo 19/03/2009, 09:40
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

Ya conseguí parsear uno delo chorizos grandes:

array(1) { ["JP_ZoneListRS"]=> array(1) { ["Zone"]=> array(38) { [0]=> array(4) { ["!Code"]=> string(5) "37356" ["!Name"]=> string(7) "Andorra" ["!Parent"]=> string(0) "" ["!IATA"]=> string(2) "AD" } [1]=> array(4) { ["!Code"]=> string(5) "17605" ["!Name"]=> string(6) "Brasil" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "BR " } [2]=> array(4) { ["!Code"]=> string(5) "17613" ["!Name"]=> string(7) "Canadá" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "CA " } [3]=> array(4) { ["!Code"]=> string(5) "36560" ["!Name"]=> string(23) "Emiratos Árabes Unidos" ["!Parent"]=> string(0) "" ["!IATA"]=> string(2) "AE" } [4]=> array(4) { ["!Code"]=> string(5) "17748" ["!Name"]=> string(7) "España" ["!Parent"]=> string(0) "" ["!IATA"]=> string(2) "ES" } [5]=> array(4) { ["!Code"]=> string(5) "17647" ["!Name"]=> string(7) "Francia" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "FR " } [6]=> array(4) { ["!Code"]=> string(5) "17700" ["!Name"]=> string(7) "México" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "MX " } [7]=> array(4) { ["!Code"]=> string(5) "17729" ["!Name"]=> string(8) "Portugal" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "PT " } [8]=> array(4) { ["!Code"]=> string(5) "17784" ["!Name"]=> string(11) "Reino Unido" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "GB " } [9]=> array(4) { ["!Code"]=> string(5) "36609" ["!Name"]=> string(7) "Ucrania" ["!Parent"]=> string(0) "" ["!IATA"]=> string(2) "UA" } [10]=> array(4) { ["!Code"]=> string(5) "17785" ["!Name"]=> string(3) "Usa" ["!Parent"]=> string(0) "" ["!IATA"]=> string(3) "US " } [11]=> array(4) { ["!Code"]=> string(5) "35386" ["!Name"]=> string(17) "Barcelona Región" ["!Parent"]=> string(5) "17748" ["!IATA"]=> string(0) "" } [12]=> array(4) { ["!Code"]=> string(5) "26639" ["!Name"]=> string(8) "Colorado" ["!Parent"]=> string(5) "17785" ["!IATA"]=> string(0) "" } [13]=> array(4) { ["!Code"]=> string(5) "36501" ["!Name"]=> string(11) "Costa Brava" ["!Parent"]=> string(5) "17748" ["!IATA"]=> string(0) "" } [14]=> array(4) { ["!Code"]=> string(5) "36773" ["!Name"]=> string(5) "Dubai" ["!Parent"]=> string(5) "36560" ["!IATA"]=> string(3) "DXB" } [15]=> array(4) { ["!Code"]=> string(5) "35311" ["!Name"]=> string(7) "Florida" ["!Parent"]=> string(5) "17785" ["!IATA"]=> string(0) "" } [16]=> array(4) { ["!Code"]=> string(5) "38364" ["!Name"]=> string(20) "Governador Valadares" ["!Parent"]=> string(5) "17605" ["!IATA"]=> string(3) "GVR" } [17]=> array(4) { ["!Code"]=> string(5) "47386" ["!Name"]=> string(10) "Inglaterra" ["!Parent"]=> string(5) "17784" ["!IATA"]=> string(0) "" } [18]=> array(4) { ["!Code"]=> string(5) "41765" ["!Name"]=> string(14) "Islas Baleares" ["!Parent"]=> string(5) "17748" ["!IATA"]=> string(0) "" } [19]=> array(4) { ["!Code"]=> string(5) "36916" ["!Name"]=> string(4) "Kiev" ["!Parent"]=> string(5) "36609" ["!IATA"]=> string(3) "IEV" } [20]=> array(4) { ["!Code"]=> string(5) "33448" ["!Name"]=> string(22) "Lisboa (Y Alrededores)" ["!Parent"]=> string(5) "17729" ["!IATA"]=> string(3) "LIS" } [21]=> array(4) { ["!Code"]=> string(5) "35315" ["!Name"]=> string(6) "Nevada" ["!Parent"]=> string(5) "17785" ["!IATA"]=> string(0) "" } [22]=> array(4) { ["!Code"]=> string(5) "19109" ["!Name"]=> string(5) "Paris" ["!Parent"]=> string(5) "17647" ["!IATA"]=> string(3) "PAR" } [23]=> array(4) { ["!Code"]=> string(5) "38695" ["!Name"]=> string(10) "Pontevedra" ["!Parent"]=> string(5) "17748" ["!IATA"]=> string(0) "" } [24]=> array(4) { ["!Code"]=> string(5) "35301" ["!Name"]=> string(12) "Quintana Roo" ["!Parent"]=> string(5) "17700" ["!IATA"]=> string(0) "" } [25]=> array(4) { ["!Code"]=> string(5) "36259" ["!Name"]=> string(8) "Salvador" ["!Parent"]=> string(5) "17605" ["!IATA"]=> string(3) "SSA" } [26]=> array(4) { ["!Code"]=> string(5) "18812" ["!Name"]=> string(7) "Toronto" ["!Parent"]=> string(5) "17613" ["!IATA"]=> string(3) "YTO" } [27]=> array(4) { ["!Code"]=> string(5) "18775" ["!Name"]=> string(9) "Vancouver" ["!Parent"]=> string(5) "17613" ["!IATA"]=> string(3) "YVR" } [28]=> array(4) { ["!Code"]=> string(5) "25720" ["!Name"]=> string(5) "Aspen" ["!Parent"]=> string(5) "26639" ["!IATA"]=> string(3) "ASE" } [29]=> array(4) { ["!Code"]=> string(5) "41641" ["!Name"]=> string(16) "Barcelona Ciudad" ["!Parent"]=> string(5) "35386" ["!IATA"]=> string(3) "BCN" } [30]=> array(4) { ["!Code"]=> string(5) "22520" ["!Name"]=> string(7) "Cancún" ["!Parent"]=> string(5) "35301" ["!IATA"]=> string(3) "CUN" } [31]=> array(4) { ["!Code"]=> string(5) "26739" ["!Name"]=> string(9) "Las Vegas" ["!Parent"]=> string(5) "35315" ["!IATA"]=> string(3) "LAS" } [32]=> array(4) { ["!Code"]=> string(5) "45369" ["!Name"]=> string(13) "Lisboa Ciudad" ["!Parent"]=> string(5) "33448" ["!IATA"]=> string(3) "LIS" } [33]=> array(4) { ["!Code"]=> string(5) "35417" ["!Name"]=> string(21) "Londres Y Alrededores" ["!Parent"]=> string(5) "47386" ["!IATA"]=> string(3) "LON" } [34]=> array(4) { ["!Code"]=> string(5) "17852" ["!Name"]=> string(8) "Mallorca" ["!Parent"]=> string(5) "41765" ["!IATA"]=> string(0) "" } [35]=> array(4) { ["!Code"]=> string(5) "35424" ["!Name"]=> string(5) "Miami" ["!Parent"]=> string(5) "35311" ["!IATA"]=> string(3) "MIA" } [36]=> array(4) { ["!Code"]=> string(5) "26060" ["!Name"]=> string(7) "Orlando" ["!Parent"]=> string(5) "35311" ["!IATA"]=> string(3) "ORL" } [37]=> array(4) { ["!Code"]=> string(5) "41770" ["!Name"]=> string(20) "Barcelona Aeropuerto" ["!Parent"]=> string(5) "41641" ["!IATA"]=> string(3) "BCN" } } } }

son arrays multidimensionales... este primero fue facil de parsear con un foreach anidado:

foreach($result['JP_ZoneListRS'] as $fila){
foreach($fila as $elemento[]){
echo($elemento[$i]['!Name']);
$i++;
echo "<br />";
}
}

Pero si es una chorizo más complicado como este:

array(1) { ["OTA_HotelAvailRS"]=> array(3) { ["Success"]=> string(0) "" ["RoomStays"]=> array(1) { ["RoomStay"]=> array(99) { [0]=> array(6) { ["RoomTypes"]=> string(0) "" ["RoomRates"]=> array(1) { ["RoomRate"]=> array(4) { [0]=> array(5) { ["Rates"]=> array(1) { ["Rate"]=> array(5) { ["Total"]=> array(2) { ["!AmountAfterTax"]=> string(5) "67.94" ["!DecimalPlaces"]=> string(1) "2" } ["RateDescription"]=> array(1) { ["Text"]=> string(8) "Standard" } ["TPA_Extensions"]=> array(1) { ["DailyBreakdown"]=> string(5) "67.94" } ["!NumberOfUnits"]=> string(1) "1" ["!RateMode"]=> string(4) "Room" } } ["Total"]=> array(3) { ["!AmountAfterTax"]=> string(5) "67.94" ["!CurrencyCode"]=> string(3) "USD" ["!DecimalPlaces"]=> string(1) "2" } ["!RatePlanCode"]=> string(152) "/eEaQ/eE0sK1J7XaY2n2fvmbix4vd6oIm/H/JsqI/1WOHHaSpsVubAMBhk4aA+QpHaoB2cyJ5+ei7YACfkhFG8JUOBz 0Cqsff7UR7WNhazKjDvIxRTvZcxlfbUoTQdzZlKse12gAyhLVO pDTplmUHg==" ["!RatePlanCategory"]=> string(9) "Room only" ["!AvailabilityStatus"]=> string(16) "AvailableForSale" } [1]=> array(5) { ["Rates"]=> array(1) { ["Rate"]=> array(5) { ["Total"]=> array(2) { ["!AmountAfterTax"]=> string(5) "67.94" ["!DecimalPlaces"]=> string(1) "2" } ["RateDescription"]=> array(1) { ["Text"]=> string(21) "Standard (Double bed)" } ["TPA_Extensions"]=> array(1) { ["DailyBreakdown"]=> string(5) "67.94" } ["!NumberOfUnits"]=> string(1) "1" ["!RateMode"]=> string(4) "Room" } } ["Total"]=> array(3) { ["!AmountAfterTax"]=> string(5) "67.94" ["!CurrencyCode"]=> string(3) "USD" ["!DecimalPlaces"]=> string(1) "2" }

(no está el chorizo entero)

No hay una forma más fácil para parsear el array???
  #13 (permalink)  
Antiguo 19/03/2009, 10:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

No veo porque es complicado, si sabes donde esta el valor es facil ir a la direccion:
$result['path']['otropath']['maspaths']['etc'].

Saludos.
  #14 (permalink)  
Antiguo 19/03/2009, 11:20
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

Sí, pero si lo que tengo que hacer el parsear un nivel?
  #15 (permalink)  
Antiguo 19/03/2009, 11:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Esque depende de lo que quieras "parsear" y como y donde lo quieres guardar.

Saludos.
  #16 (permalink)  
Antiguo 24/03/2009, 03:58
Avatar de Sonaoao  
Fecha de Ingreso: marzo-2009
Ubicación: Málaga (España)
Mensajes: 10
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Petición SOAP por HTTP

Pues lo que quiero piontar es la lista de hoteles, con algunas de sus características...
  #17 (permalink)  
Antiguo 24/03/2009, 09:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Petición SOAP por HTTP

Pues no veo donde esta esa lista, pero con un foreach() sabiendo donde esta lo puedes hacer si ya tienes la estructura del array.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:55.