2

配列を値として PHP soapclient リクエストに渡すにはどうすればよいですか?

インスタンス化され、すでに接続されているsoapclientがあります。次に、3 つのパラメーター (文字列、文字列、ハッシュマップ) を必要とする Web サービス メソッドを呼び出そうとします。

これが私が下で働くことを期待したものです。しかし、xml 出力を表示すると、params ノードは空です。

soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => array('email' => 'test@test.com', 'password' => 'password', 'blah' => 'blah')));

SOAP 本体の xml は次のようになります (空の params 要素に注意してください)。

<SOAP-ENV:Body><ns1:doSomething>
<id>blah</id>
<page>blah</page>
<params/>
</ns1:register></SOAP-ENV:Body>
4

2 に答える 2

3

JAX-WS Web サービスの場合、hashmap 入力パラメーターに問題がある可能性があります。生成された xsd スキーマは、ハッシュマップに対して正しくないようです。マップをラッパー オブジェクトに配置すると、JAX-WS は正しい xsd を出力します。

public class MapWrapper {
    public HashMap<String, String> map;
}


// in your web service class
@WebMethod(operationName = "doSomething")
public SomeResponseObject doSomething(
        @WebParam(name = "id") String id,
        @WebParam(name = "page") String page,
        @WebParam(name = "params") MapWrapper params {
    // body of method
}

その後、php コードは成功します。SoapVar も SoapParam も必要なく、MapWrapper なしではこれらのメソッドを動作させることができないことがわかりました。

$entry1['key'] = 'somekey';
$entry1['value'] = 1;
$params['map'] = array($entry1);
soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 
    'params' => $params));

ラッパーで生成された正しい xsd は次のとおりです。

<xs:complexType name="mapWrapper">
  <xs:sequence>
    <xs:element name="map">
      <xs:complexType>
        <xs:sequence>
          <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="key" minOccurs="0" type="xs:string"/>
                <xs:element name="value" minOccurs="0" type="xs:string"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

ハッシュマップのみを使用して JAX-WS によって生成された誤ったスキーマを次に示します。

<xs:complexType name="hashMap">
  <xs:complexContent>
    <xs:extension base="tns:abstractMap">
      <xs:sequence/>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="abstractMap" abstract="true">
  <xs:sequence/>
</xs:complexType>

最後のメモ。HashMap<String, String> のラッピングはこのソリューションで機能しましたが、HashMap<String, Object> は機能しませんでした。オブジェクトは xsd:anyType にマップされ、単なるオブジェクトではなく xsd スキーマ オブジェクトとして Java Web サービスに入ります。

于 2010-10-13T20:33:13.837 に答える
0

Webサービスの定義によっては、ハッシュマップパラメータに、配列から直接作成できない特定の構造/エンコーディングが必要になる場合があります。その上でWSDLを確認し、SoapVarクラスとSoapParamクラスを調べて、Soapパラメーターの構築に関するその他のオプションを確認することをお勧めします。

于 2010-03-03T12:06:26.787 に答える