entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

SOAP ASMX en JQuery o PHP

Hola buen día, la situación es la siguiente:

  • Tengo que realizar una apliación web donde se consulte un Web Service y muestre los resultados del mismo en la aplicación.
  • El webservice esta en entornos asmx del cual no tengo acceso ni puedo cambiar nada, solo tengo la url y los metodos que usar.
  • He intentado enviar/recibir datos del webservice desde otro servidor donde esta la aplicación que estoy desarrollando, he intenado con JQuery y PHP pero sin exito.

He investigado y al pareces se debe a que no se puede acceder al SOAP de otro dominio al que esta guardado, pero vienen muchas respuestas involucrando el accesso al servicio al cual no tengo acceso, otras usando JSOP entre otras cosas raras, he probado ya mucho y no tengo exito consiguiendo que funcione, aclaro que soy nuevo en el uso de SOAP y más que nada del asmx, ojala me puedan orientar con una buena referencia o código ya sea jquery o php, se les agradeceria bastanta.

pueden usar esta liga como ejemplo de servicio asmx, el cual también he tratado de hacer funcionar que me de datos pero en fin sin resultados:
http://www.w3schools.com/webservices/tempconvert.asmx

Sin más agradezco el apoyo y que lean estas líneas, saludos!

dairon comentado Abr 15, 2015

sería bueno que pusieras el código que utilizas para consumir el servicio para que vean como guiarte en resolver tu problema.
Saludos

hartlink comentado Abr 15, 2015

Sí Claro he usado estos ejemplos:
https://leonidius2010.wordpress.com/2011/05/16/98/
http://www.virtualsecrets.com/jquery-send-receive-xml-json.html
Son lo más cercano al código que he utilizado pero como mencionan algunos comentarios o el post mismo no funciona cuando se ejecuta en un dominio diferente al que esta el WebService.

Muchas gracias! Saludos!

2 Respuestas

1voto

hartlink Puntos810

Ya dí con la respuesta, al final lo hizo con un código PHP e hice un Parse através de JSON para optener un array. sin más dejo el código y otra fuente por si alguien tiene el mismo problema.

Saludos a todos!

Referencia: https://jqueryninja.wordpress.com/2011/01/18/calling-a-net-service-from-jquery/

Codigo PHP:

<?
    //Data, connection, auth
        $dataFromTheForm = '1'; // request data from the form
        $soapUrl = "http://www.w3schools.com/webservices/tempconvert.asmx?op=CelsiusToFahrenheit"; // asmx URL of WSDL
        $soapUser = "";  //  username
        $soapPassword = ""; // password

        // xml post structure

        $xml_post_string = '<?xml version="1.0" encoding="utf-8"?>
                            <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
                              <soap:Body>
                                <CelsiusToFahrenheit xmlns="http://www.w3schools.com/webservices/"> // xmlns value to be set to yours WSDL URL
                                  <Celsius>'.$dataFromTheForm.'</Celsius> 
                                </CelsiusToFahrenheit >
                              </soap:Body>
                            </soap:Envelope>';   // data from the form, e.g. some ID number

           $headers = array(
                        "Content-type: text/xml;charset=\"utf-8\"",
                        "Accept: text/xml",
                        "Cache-Control: no-cache",
                        "Pragma: no-cache",
                        "SOAPAction: http://www.w3schools.com/webservices/tempconvert.asmx/CelsiusToFahrenheit", 
                        "Content-length: ".strlen($xml_post_string),
                    ); //SOAPAction: your op URL

            $url = $soapUrl;

            // PHP cURL  for https connection with auth
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
           // curl_setopt($ch, CURLOPT_USERPWD, $soapUser.":".$soapPassword); // username and password - declared at the top of the doc
            curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
            curl_setopt($ch, CURLOPT_TIMEOUT, 10);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_post_string); // the SOAP request
            curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

            // converting
            $response = curl_exec($ch); 
            curl_close($ch);

            // converting
            $response1 = str_replace("<soap:Body>","",$response);
            $response2 = str_replace("</soap:Body>","",$response1);

            // convertingc to XML
            $parser = simplexml_load_string($response2);
            // user $parser to get your data out of XML response and to display it.

            print_r($parser);

            $xml = json_decode(json_encode((array) simplexml_load_string($parser)), 1);

            print_r($xml);

 // Método sin autenticación y resultados a un solo objeto.

 try {
    $client = new SoapClient('http://clima.inifap.gob.mx/data/webservice.asmx?WSDL');
    $response = $client->GetEstaciones(array(
        'edo' => '1',

    ));

//    print_r($response); // view the full response to see what is returned

    // or get the response properties:
    echo $response->RequestResult->Ref_no;
    echo $response->RequestResult->StatusCode;

} catch (Exception $e) {
    echo $e->getMessage();
}
?>

2votos

carlossevi Puntos63050

Se trata de un mecanismo de seguridad de muchos navegadores que evitan llamadas JSON a servicios web que están alojados en otros dominios. Para poder hacer peticiones de ese tiempo debes utilizar JSONP en lugar de JSON.

JSONP o JSON con padding es una técnica de comunicación utilizada en
los programas JavaScript para realizar llamadas asíncronas a dominios
diferentes. JSONP es un método concebido para suplir la limitación de
AJAX entre dominios, que únicamente permite realizar peticiones a
páginas que se encuentran bajo el mismo dominio y puerto por razones
de seguridad.

hartlink comentado Abr 16, 2015

Sí allí el problema es de lo que ya habia investigado, las soluciones con JSONP son muy ambiguas que no llevan a nada, y solo mencionan usa JSONP, pero luego de una desvelada puede realizar bien el código, agradezco tu comentario, Saludos!

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta