PHP 5.3 SOAPリクエストはどのように形成されますか?

私はSmarterMail APIと対話するためにいくつかのコードを書こうとしていますが、PHPフォーマットを適切にフォーマットすることはできません。私が今まで持っている[醜い]コードは次のとおりです:

<?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 "
";

$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は次のとおりです。


    
        
            
            
        
    

指定されたリクエストは次のとおりです。

<?xml version="1.0" encoding="utf-8"?>

  
    
      string
      string
    
  

しかし、私のコードで生成される要求は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>

    
        
        admin
        derp
    

何らかの理由で、ユーザー名とパスワードのパラメータがGetAllDomainsセクションに含まれていないことがわかります。同様に、コードでは最初にダミーのパラメータを渡さなければならないことがわかります。なぜなら、最初のものがリクエストに現れないからです。また、キーがパラメータ名として使われていないため、代わりに 'param1'と 'param2'に代入するため、単に連想配列を渡すことはできません。

私は、サーバーが要求を受け入れ、authが失敗したというメッセージを返すことに注意してください。サーバーにはSOAPリクエスト・テスターが組み込まれており、リクエストがこの例に合っていると正常に動作します。

私がPHPのドキュメントやGoogleを見てきたことは、これが難しいことではないことを示しているようです。 :(

どんな助力も大いに感謝しています。

注:私は、Apache 5.2でFreeBSD上でPHP 5.3.8を実行しています。現在、ポート経由で構築され、インストールされています。

返信後編集:

下のGianの答えに感謝します。私はこの作業を行い、コードを大幅に簡略化しました:

<?php

echo "
";

$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
@Gian私は実際に接続を見ていない。彼の問題はSOAPヘッダーと関係していることが分かりましたが、このアプリケーションではヘッダーセクションは必要ありません。このベースアックAPIでは、ユーザ名とパスワードは、ヘッダーの一部ではなく、認証を必要とするすべての機能に引数として送信されます。
追加された 著者 Sammitch,
追加された 著者 Gian,

1 答え

誤って指示された閉鎖の私の申し立て。あなたが最初にやろうとしていたことを誤解しました。

soapCall のドキュメントコメントを読んで、私が試してみるべきことがいくつかあります。まず、これは:

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

どうやら、あなたのパラメータはキー 'parameters'を持つ連想配列の要素である必要があります。奇妙な、ハァッ?

失敗した場合、これをさらに深く入れ替える必要があるかもしれません! _ 配列の項目はどこにでも明示されているようには見えませんが、これはPHP文書のコメント者が示唆していたようです。だからこれは多分:

$soap_user_params = array(
    'parameters' => array (
        'AuthUserName'  => array('_' => 'admin'),
        'AuthPassword'  => array('_' => 'derp')
    )
);
1
追加された
これをなぜ parameters 配列の中に入れ子にしているのかは分かりませんが、なぜこれがなぜ必要なのか混乱しています。私も _ 配列を試しましたが、うまくいきませんでした。私は、[ php.net/manual/en/ soapCall のdocページのsoapclient.soapcall.php#89308(あなたが参照していたコメント)を参照してください。これは、SOAPサーバーが.NETであることを意味するようですGDI MS!* rantrantrant *
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com