Отправка XML-строки (не массива) из PHP SOAP или nusoap в службу .NET - PullRequest
1 голос
/ 19 ноября 2010

Я новичок в SOAP, и у меня возникли проблемы (да, я много раз искал, но я не могу соответствовать моему очень простому требованию - отправка одной строки XML) с отправкой некоторого вывода в.NET сервер, чтобы соответствовать этому:

    POST /someurl.asmx HTTP/1.1
Host: www.somehost.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://somehost.com/SubmitCalls"

<?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>
    <SubmitCalls xmlns="http://somehost/">
      <request>string</request>
    </SubmitCalls>
  </soap:Body>
</soap:Envelope>

Мой код nusoap выглядит так:

<code><?php
require_once('../lib/nusoap.php');

$bodyxml = '<?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>
<SubmitCalls xmlns="http://somehost/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<request>
<?xml version="1.0" encoding="UTF-8"?>
<bXML xmlns="http://somehost/Schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <From>
  <UserName>some username</UserName>
  <Password>some password</Password>
 </From>
 <Calls>
  <Call>
   <Reference>11111</Reference>
   <Name>Joe Bloggs</Name>
   <Tel1>02075574200</Tel1>
   <Tel2>02075574201</Tel2>
   <Tel3>02075574202</Tel3>
   <Tel4>02075574203</Tel4>
   <Tel5>02075574204</Tel5>
   <CLI>08448220640</CLI>
   <CallTime>09:00</CallTime>
   <FileName>02075574200_1</FileName>
  </Call>
 <Call>
   <Reference>11111</Reference>
   <Name>Joe Bloggs</Name>
   <Tel1>02075574200</Tel1>
   <Tel2>02075574206</Tel2>
   <Tel3>02075574207</Tel3>
   <Tel4>02075574208</Tel4>
   <Tel5>02075574209</Tel5>
   <CLI>08448220640</CLI>
   <CallTime>09:00</CallTime>
   <FileName>02075574200_2</FileName>
  </Call>
 </Calls>
</bXML>
</request>
</SubmitCalls>
</soap:Body>
</soap:Envelope>
';


$client = new nusoap_client("somehost?WSDL",true);
$err = $client->getError();
if ($err) {
 echo '<h2>Constructor error</h2><pre>' . $err . '
';выход();} $ client-> soap_defencoding = 'utf-8';$ Client-> useHTTPPersistentConnection ();$ Client-> setUseCurl ($ useCURL);$ bsoapaction = "http://somehost/SubmitCalls"; $ result = $ client-> send ($ bodyxml, $ bsoapaction); // Проверить наличие ошибки if ($ client-> fault) {echo '

Fault

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

Ошибка

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

Result

';
  print_r($result);
  echo '
';}} echo '

Запрос

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

Ответ

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

Отладка клиента

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

Отладка прокси

' . htmlspecialchars($proxy->debug_str, ENT_QUOTES) . '
';?>

(Очевидно, что все имена somehost и пользователя верны впоследний сценарий.) Я могу подключиться к WSDL, прочитать его, есть только один интересующий меня метод (SubmitCalls), который имеет только одну часть, называемую «параметры» в схеме WSDL. Приведенное выше выдает ошибку 400 Bad request- есть идеи, где я ошибаюсь?

Я пытался использовать PHP SOAP вместо этого, но я просто не могу отправить строку XML в качестве тела SOAP-запроса.с этим в течение большей части трех днейи читать миллионы веб-страниц, но я все еще не могу понять это правильно.Пожалуйста, помогите .... если бы вы могли показать мне, как сделать это с помощью любой библиотеки, я был бы очень благодарен ....

Ответы [ 4 ]

5 голосов
/ 04 августа 2011

Вы можете отправить простой XML с помощью метода $ client-> send ().

$raw_xml = "<Your_XML>...</Your_XML>";
$msg = $client->serializeEnvelope("$raw_xml");
$result=$client->send($msg, $endpoint);

Пример можно посмотреть здесь:

http://itworkarounds.blogspot.com/2011/07/send-raw-xml-with-php-nusoap.html

Если это не сработает, вы можете попробовать опубликовать XML с помощью CURL.

3 голосов
/ 15 июля 2011

- попробуйте это -

$xml = simplexml_load_string('<data>x</data>')

, а затем (nusoap)

$result = $client->call('host', array('parameter' =>$xml)
1 голос
/ 22 ноября 2010

Не совсем ответ на вопрос - но теперь он решен.Поставщик услуг создал новый метод, который был идентичен во всех отношениях, за исключением того, что он допускал XML-документ, а не строку.Сделав некоторые незначительные изменения в содержимом переменной $ bodyxml и отправив в этот новый метод, он, кажется, работает нормально.

Кстати - любой, кто хочет отлаживать приложения SOAP, должен действительно взглянуть на захват SOAP UIот Sourceforge.Это действительно помогло мне проверить мою проблему и предоставило несколько полезных указателей для исправления.

0 голосов
/ 19 ноября 2010

Вы всегда можете просто отправить xml в виде строки и прикрутить библиотеки. Не рекомендуется, но в некоторых случаях это проще.

не забудьте Header("SoapAction: ...")

...