Не удается проанализировать ответ Curl от службы Soap (отправить петицию) - PullRequest
0 голосов
/ 16 июня 2020

я пытаюсь разобрать ответ curl на этот запрос:

  $soapUrl = "https://soap_example_url.com/log_in";


    // xml post structure

    $xml_post_string = '
    <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:debisys-soap-services">
    <soapenv:Body>
        <urn:Login soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
            <version xsi:type="xsd:string">'.$version.'</version>
            <userName xsi:type="xsd:string">'.$userName.'</userName>
            <password xsi:type="xsd:string">'.$password.'</password>
            <languageOption xsi:type="xsd:string">'.$language.'</languageOption>
        </urn:Login>
    </soapenv:Body>
    </soapenv:Envelope>
    ';


       $headers = array(
                    "Content-type: text/xml;charset=\"utf-8\"",
                    "Accept: text/xml",
                    "Cache-Control: no-cache",
                    "Pragma: no-cache",
                    "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, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        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);

Но когда я пытаюсь разобрать «$ response2», я ничего не получаю:

$xml = simplexml_load_string($response2);
$json = json_decode(json_encode($xml));
echo json_encode($xml, JSON_PRETTY_PRINT);

Вот что я получаю :

SimpleXMLElement Object ()

{}

print_r: stdClass Object ()

Когда я использую функцию print_r ($response2); я получаю это в своем браузере:

<Login2Response><Version>01</Version><SiteID>xxxx</SiteID><ClerkId>xxxxx</ClerkId><ResponseCode>00</ResponseCode><ResponseMessage>user logged in</ResponseMessage></Login2Response>

И когда я использую "json_encode", я получаю это:

  "\n \n \n <LoginResponse><Version>01<\/Version><SiteID>xxxxx<\/SiteID><ClerkId>xxxxx<\/ClerkId><ResponseCode>00<\/ResponseCode><ResponseMessage>user logged in<\/ResponseMessage><\/LoginResponse><\/return>\n <\/ns1:Login2Response>\n <\/soapenv:Body>\n<\/soapenv:Envelope>\n"

Итак, я попытался скопировать / вставить xml из моего браузера в переменная вроде этой:

$returned_xml = '<LoginResponse><Version>01</Version><SiteID>xxxxx</SiteID><ClerkId>xxxxx</ClerkId><ResponseCode>00</ResponseCode><ResponseMessage>user logged in</ResponseMessage></LoginResponse>';

И это работает, но мне нужно использовать $ response2, чтобы сделать это динамически, заранее спасибо.

1 Ответ

0 голосов
/ 17 июня 2020

Я ближе, я сделал это:

   $response2 = preg_replace('/(<\/?)(\w+):([^>]*>)/', '$1$2$3', $response2);
   $xml = simplexml_load_string($response2);
   $xml = var_dump($xml);
   echo '<br><br>';
   print_r($xml);

И теперь я получаю такой ответ:

object(SimpleXMLElement)#1 (1) { ["soapenvBody"]=> object(SimpleXMLElement)#2 (1) { ["ns1Login2Response"]=> object(SimpleXMLElement)#3 (1) { ["return"]=> string(194) "018821909123400USER LOGGED IN SUCCESSFULLY" } } }

Как я могу получить доступ только к ["return"] ответ, чтобы разобрать его как json объект?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...