0

これが私のPHPです:

    $url = "http://localhost:3000/api/wsdl";

    $client = new SoapClient($url);

    $params->a  = 'a Value';
    $params->b  = 'another Value';

    $client->AnOperation($params);

これは、soap サーバーを作成するために使用している、wash_out gem を使用した Ruby コントローラーです。

require "wash_out/soap"

class ApiController < ApplicationController
  soap_service namespace: 'urn:WashOut'

  soap_action "AnOperation",
              :args   => { :a => :string, :b => :string },
              :return => :string
  def AnOperation
    render :soap => "done"
  end

  before_filter :dump_parameters
  def dump_parameters
    logger.debug params.inspect
  end
end

生成された WSDL は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="urn:WashOut" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap-enc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" name="api" targetNamespace="urn:WashOut">
  <types>
    <schema targetNamespace="urn:WashOut" xmlns="http://www.w3.org/2001/XMLSchema">
    </schema>
  </types>
  <portType name="api_port">
    <operation name="AnOperation">
      <input message="tns:AnOperation"/>
      <output message="tns:AnOperation_response"/>
    </operation>
  </portType>
  <binding name="api_binding" type="tns:api_port">
    <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="AnOperation">
      <soap:operation soapAction="AnOperation"/>
      <input>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:WashOut"/>
      </input>
      <output>
        <soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:WashOut"/>
      </output>
    </operation>
  </binding>
  <service name="service">
    <port name="api_port" binding="tns:api_binding">
      <soap:address location="http://localhost:3000/api/action"/>
    </port>
  </service>
  <message name="AnOperation">
    <part name="a" type="xsd:string"/>
    <part name="b" type="xsd:string"/>
  </message>
  <message name="AnOperation_response">
    <part name="value" type="xsd:string"/>
  </message>
</definitions>

PHP を実行すると、「クラス stdClass のオブジェクトを文字列に変換できませんでした」というメッセージが表示されます。

4

1 に答える 1

0

これは次の 2 つのことのようです。

1) 私の WSDL キャッシュは PHP に対して有効でした。ruby で開発していた古いバージョンの WSDL をキャッシュしていました。実行時レベルまたは構成レベルでキャッシュを停止できます。

2) リクエストのオブジェクト構造がオフでした。キーと値のペアを持つオブジェクトを介してパラメーターを送信していましたが、これは WSDL では想定されていませんでした。WSDL での操作のメッセージを調整して、渡すパラメーターを含む「部分」を取得しました。

于 2013-10-17T23:02:32.497 に答える