Как формируется SOAP-запрос PHP 5.3? - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь написать некоторый код для взаимодействия с API SmarterMail, но я не могу заставить PHP правильно отформатировать запрос.[Уродливый] код, который у меня есть на данный момент:

<code><?php
function array_to_params($in_arr) {
    $out_arr = array();

    foreach( $in_arr as $key => $value ) {
        $out_arr[] = new SoapParam($value, $key);
    }
    return $out_arr;
}

echo "<pre>";

$soapClient = new SoapClient(
    "http://mailserver.net/Services/svcDomainAdmin.asmx?WSDL",
    array('trace' => true)
);

var_dump($soapClient->__getTypes());die();

$soap_user_params = array(
    'blank'         => 'blank', //if I don't have a dummy entry the first parameter doesn't show up.
    'AuthUserName'  => 'admin',
    'AuthPassword'  => 'derp'
);
$soap_user_params = array_to_params($soap_user_params);

$error = FALSE;
try {
    $info = $soapClient->__soapCall("GetAllDomains", $soap_user_params);
//  $info = $soapClient->GetAllDomains($soap_user_params); //same results
} catch (SoapFault $fault) {
    $error = TRUE;
    printf("Error %s: %s\n", $fault->faultcode, $fault->faultstring);
}

if( !$error ) {
    var_dump($info);
    echo "\nRequest: " . htmlentities($soapClient->__getLastRequest());
}

echo "
";?>

Для справки, WSDL для этой функции:

<s:element name="GetAllDomains">
    <s:complexType>
        <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="AuthUserName" type="s:string"/>
            <s:element minOccurs="0" maxOccurs="1" name="AuthPassword" type="s:string"/>
        </s:sequence>
    </s:complexType>
</s:element>

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

<?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>
    <GetAllDomains xmlns="http://tempuri.org/">
      <AuthUserName>string</AuthUserName>
      <AuthPassword>string</AuthPassword>
    </GetAllDomains>
  </soap:Body>
</soap:Envelope>

Но запрос, сгенерированный моим кодом:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://tempuri.org/">
    <SOAP-ENV:Body>
        <ns1:GetAllDomains/>
        <AuthUserName>admin</AuthUserName>
        <AuthPassword>derp</AuthPassword>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Вы можете видеть, что параметры имени пользователя и пароля не содержатся в разделе GetAllDomains для некоторыхпричина. Кроме того, в коде вы можете видеть, что сначала я должен передать фиктивный параметр, потому что то, что находится первым, не отображается в запросе. Кроме того, я не могу просто передать ассоциативный массив, потому что ключи не используются какимена параметров, вместо этого он добавляет «param1» и «param2».

Я должен отметить, что сервер принимает запрос и выдает сообщение об ошибке аутентификации. Встроенный тестер запросов SOAP включенсервер, и когда запрос соответствует данному примеру, он работает нормально.

Все, что я посмотрел в PHP документах и ​​через Google, похоже, указывает на то, что это не должно быть этой разницейicult.: (

Любая помощь приветствуется.

примечание: я использую PHP 5.3.8 на Apache 2.2 на FreeBSD, собранный и установленный через порты сегодня.

post-answer-edit:

Благодаря приведенному ниже ответу Джиана я получил эту работу и значительно упростил код:

<code><?php

echo "<pre>";

$soapClient = new SoapClient( "http://mailserver.net/Services/svcDomainAdmin.asmx?WSDL", array( 'trace' => true ) );

$soap_user_params = array(
    'AuthUserName'  => 'admin',
    'AuthPassword'  => 'derp'
);

try {
    $info = $soapClient->__soapCall("GetAllDomains", array( 'parameters' => $soap_user_params ) );
    var_dump($info);
    echo "\nRequest:\n" . htmlentities($soapClient->__getLastRequest());
} catch (SoapFault $fault) {
    printf("Error %s: %s\n", $fault->faultcode, $fault->faultstring);
}

echo "
";

1 Ответ

1 голос
/ 25 ноября 2011

Мои извинения за неправильно направленное закрытие.Сначала я неправильно понял, что вы пытались сделать.

Просматривая комментарии к документации soapCall, я бы хотел попробовать пару вещей.Прежде всего, это:

$soap_user_params = array(
    'parameters' => array (
        'AuthUserName'  => 'admin',
        'AuthPassword'  => 'derp'
    )
);

Видимо, ваши параметры должны быть элементом в ассоциативном массиве с ключом 'параметры'.Странно, да?

Если это не удастся, вам может понадобиться еще глубже вложить это!Запись массива _, кажется, не документирована нигде очевидным, но, похоже, это было то, что предлагали комментаторы в документации по PHP.Так что, может быть, это:

$soap_user_params = array(
    'parameters' => array (
        'AuthUserName'  => array('_' => 'admin'),
        'AuthPassword'  => array('_' => 'derp')
    )
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...