PHP / jQuery / AJAX + POST SOAP-запрос с аутентификацией - PullRequest
3 голосов
/ 18 августа 2011

Я искал способ выполнить запрос формы (post) с SOAP с использованием jQuery / AJAX.

Я нашел следующее решение для запроса SOAP jQuery / AJAX с фоном ColdFusion.

Отправка запросов XML SOAP с помощью jQuery

Кто-нибудь знает, как реализовать это с помощью PHP?

Обратите внимание:

  • Требуется ssl-соединение.
  • Требуется проверка подлинности мылом (пользователь и пароль).

Любая помощь / предложение приветствуется.

Ответы [ 3 ]

1 голос
/ 28 сентября 2012

Я знаю, что это старый ... но я столкнулся с этой проблемой (я использовал прокси по его ссылке, и мне нужен был один в php при переходе на новую систему на работе.)

Если кому-то интересно, я перевел их прокси-сервер coldfusion в примерный эквивалент php (без проверки ошибок, но вызов jquery ajax идентичен, за исключением php-файла)

<?php 
    $action = $_SERVER['HTTP_SOAPACTION'];
    $target = $_SERVER['HTTP_SOAPTARGET'];
    $soap_body = file_get_contents('php://input');

    $headers = array(
        "Content-type: text/xml;charset=\"utf-8\"",
        "Accept: text/xml",
        "Cache-Control: no-cache",
        "Pragma: no-cache",
        "SOAPAction: ".$action,
        "Content-length: ".strlen($soap_body),
    );

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_URL, $target);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($ch, CURLOPT_TIMEOUT, 60);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $soap_body);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $response = curl_exec($ch); 
    curl_close($ch);
    echo($response);
?>

Здесь снова ссылка напосмотрите html и javascript / jquery, необходимые для вызова этого прокси.http://www.bennadel.com/blog/1853-Posting-XML-SOAP-Requests-With-jQuery.htm

1 голос
/ 23 августа 2011

Пример запроса SOAP:

  • с HTTPS / SSL
  • с паролем и именем пользователя auth
  • проверено и работает!
  • два примера эха - для одного и нескольких результатов
<ч />
     <?php 
        //Data, connection, auth
        $dataFromTheForm = $_POST['fieldName']; // request data from the form
        $soapUrl = "https://connecting.website.com/soap.asmx?op=DoSomething"; // asmx URL of WSDL
        $soapUser = "username";  //  username
        $soapPassword = "password"; // 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>
                                <GetItemPrice xmlns="http://connecting.website.com/WSDL_Service"> // xmlns value to be set to your's WSDL URL
                                  <PRICE>'.$dataFromTheForm.'</PRICE> // data from the form, e.g. some ID number
                                </GetItemPrice >
                              </soap:Body>
                            </soap:Envelope>';

            $headers = array(
                        "Content-type: text/xml;charset=\"utf-8\"",
                        "Accept: text/xml",
                        "Cache-Control: no-cache",
                        "Pragma: no-cache",
                        "SOAPAction: http://connecting.website.com/WSDL_Service/GetPrice", // your op URL
                        "Content-length: ".strlen($xml_post_string),
                    );

            $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); // XML 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);        



    ?>
<ч />

Пример отображения одного результата:

  $getPrice = $parser->GetItemPriceResponse->PRICE;

  if($getPrice) { // if found based on our $_POST entry echo the result
         echo $getPrice;
  } else { // if not found, echo error
        echo "Sorry. No price tag for this item.";
  }
<ч />

Пример отображения нескольких результатов:

 $getPrice = $parser->GetItemPriceResponse->PRICE;

                if($getPrice) { // if found  more than 0, return as a select dropdown

                    echo "<form action='soapMoreDetails.php' method='post'>";
                    echo "<select name='priceMoreDetails'>";

                    foreach ($parser->GetItemPriceResponse as $item) {
                        echo '<option value="'.$item->PRICE.'">';
                        echo $item->PriceBasedOnSize; // for e.g. different prices for different sizes
                        echo '</option>';
                    }

                    echo "</select>";
                    echo "<input type='submit'>";
                    echo "</form>";

                } else {
                    echo "Sorry. No records found.";

                }
0 голосов
/ 07 января 2015

Я пробовал сервер SOAP PHP с клиентом ajax и нашел рабочий код

Сначала загрузите библиотеку nusoap с Здесь

, затем создайте server.php

<?php
//call library 
require_once ('lib/nusoap.php'); 

// Define the TriangleArea method as a PHP function 
function TriangleArea($b, $h) { return 'The triangle area is: ' .(($b*$h)/2); } 
// Define the RectangleArea method as a PHP function 
function RectangleArea($L, $l) { return 'The rectangle area is: ' .($L*$l); }
// create the function 
function get_message($your_name) 
{ 
if(!$your_name){ 
return new soap_fault('Client','','Put Your Name!'); 
} 
$result = "Welcome to ".$your_name .". Thanks for Your First Web Service Using PHP with SOAP"; 
return $result; 
}


//using soap_server to create server object 
$server = new soap_server; 

// Initialize WSDL support 
$server->configureWSDL('mathwsdl', 'urn:mathwsdl'); 


 // Register the TriangleArea method 
   $server->register('TriangleArea',                  // method name
       array('b' => 'xsd:int', 'h' => 'xsd:int'),     // input parameters
       array('area_t' => 'xsd:string'),               // output parameters
       'urn:mathwsdl',                                // namespace
       'urn:mathwsdl#TriangleArea',                   // soapaction
       'rpc',                                         // style
       'encoded',                                     // use
       '1=> : Calculate a triangle area as (b*h)/2'         // documentation
   );

   // Register the RectangleArea method to expose
   $server->register('RectangleArea',                 // method name
       array('L' => 'xsd:int', 'l' => 'xsd:int'),     // input parameters
       array('area_r' => 'xsd:string'),               // output parameters
       'urn:mathwsdl',                                // namespace
       'urn:RectangleAreawsdl#RectangleArea',         // soapaction
       'rpc',                                         // style
       'encoded',                                     // use
       '2=> : Calculate a rectangle area as (L*l)'          // documentation
   );


    // Register the RectangleArea method to expose
   $server->register('get_message',                 // method name
       array('nm' => 'xsd:string'),     // input parameters
       array('area_r' => 'xsd:string'),               // output parameters
       'urn:mathwsdl',                                // namespace
       'urn:get_messagewsdl#get_message',         // soapaction
       'rpc',                                         // style
       'encoded',                                     // use
       '3=> : Print a Message as name'          // documentation
   ); 




if ( !isset( $HTTP_RAW_POST_DATA ) ) $HTTP_RAW_POST_DATA =file_get_contents( 'php://input' );
$server->service($HTTP_RAW_POST_DATA);
// create HTTP listener 
//$server->service($HTTP_RAW_POST_DATA); 
exit(); 
?>

после этого создайте client.php

<code><?php 
require_once ('lib/nusoap.php'); 
//Give it value at parameter 
$param = array( 'your_name' => 'Monotosh Roy'); 
//Create object that referer a web services
$client = new soapclient('http://localhost:81/WebServiceSOAP/server.php?wsdl', true); 

 // Check for an error
   $err = $client->getError();
   if ($err) {
      // Display the error
      echo '<h2>Constructor error</h2><pre>' . $err . '
';// На данный момент вы знаете, что любые вызовы // методов этого веб-сервиса завершатся ошибкой} // Вызовите метод SOAP TriangleArea $ result = $ client-> call ('TriangleArea', array ('b' => 10, 'h '=> 15));// Проверка на наличие ошибки if ($ client-> fault) {echo '

Fault

';
       print_r($result);
       echo '
';} else {// Проверка на ошибки $ err = $ client-> getError ();if ($ err) {// Показать ошибку echo '

Error

' . $err . '
';} else {// Показать результат echo '

Result

';
           print_r($result);
       echo '
';}} // Вызвать метод SOAP RectangleArea $ result = $ client-> call ('RectangleArea', array ('L' => 40, 'l' => 20));// Проверка на наличие ошибки if ($ client-> fault) {echo '

Fault

';
       print_r($result);
       echo '
';} else {// Проверка на ошибки $ err = $ client-> getError ();if ($ err) {// Показать ошибку echo '

Error

' . $err . '
';} else {// Показать результат echo '

Result

';
           print_r($result);
       echo '
';}} // Показать запрос и ответ / * echo '

Request

';echo '
' . htmlspecialchars($client->request, 
      ENT_QUOTES) . '
';echo '

Response

';echo '
' . htmlspecialchars($client->response, 
      ENT_QUOTES) . '
'; * / // Вызов функции на сервере и отправка параметров тоже $ response = $ client-> call ('get_message', $ param);// Обработка результата if ($ client-> fault) {echo "

FAULT:

Код: (". $ Client-> faultcode. "

"; echo "String:". $client-> faultstring;} else {echo $ response;}?> Веб-сервис SOAP и AJAX
...