php javaパブリッシュのwebserviceを呼び出す
10631 ワード
JAvaはspring webserviceによって発行されたサービスを使用し、phpによってSoapClientによって呼び出されます.
Java呼び出しパブリッシュのwebservice、問題なし、ツールSOAP UI呼び出し、問題なし、
同じphpコードでgoogleを呼び出す天気サービスは大丈夫です.私たちのwsdlを呼び出すのはだめです.
手探りでデバッグした結果、以下の問題と解決の過程が見つかりました.
最初にリリースされたwsdlは次のとおりです.
ここでは、PingをPingRequestとPingResponseとして入力する方法を定義します.PingRequestにはechoのプロパティが含まれ、BaseRequestのオブジェクトが統合されます.
php呼び出しを使用するコードを次に示します.
最初に呼び出したときに取得したエラーはPingメソッドが見つからず、その後どのように解決されたのか分かりません.
後にSoapClientの呼び出しパラメータWSDL_が追加されましたCACHE_NONEは、サーバがwsdlを変更しても更新できないように、soap呼び出し時にwsdをキャッシュしないようにします.このパラメータを設定すると、呼び出すたびにwsdlファイルが再loadされるため、javaのlogを監視するとgetリクエストが取得されます.最初はwsdlを呼び出すリクエストだと思っていましたが、wsdlのリクエストを持っていることに気づきました.
このチェックボックスを過ぎると、次のエラーが発生します.Unable to parse URL
この原因はgoogleを経てwsdlに問題があることを発見しました:
ここにwsdl会:
この方法でjava呼び出しを使うのは問題ありませんが、php呼び出しを使うのはだめです.さらに誤ったヒント情報を加えると、SoapClientはこのlocationを知能的に解析していないため、soapのアドレス(ここではアドレスと呼ばれていますが、実は私もどういう意味なのか分かりません.wsdlのプロトコルを見て理解したいと思っています.)を呼び出すことはできません.
上記の方法では、SoapClient呼び出しにパラメータを追加します:location=>"http://www.phpxiaoxin.com/soap/doorway"
しかし、この方法は明らかによくありません.より良い方法は、生成されたwsdlでlocationパラメータを直接絶対urlアドレスに設定することです.相対的ではなく、空ではありません.
もう一つの詳細はsoapですversion,分为:SOAP_1_1,SOAP_1_2この2つのヘッダは異なり、1つはtext/xml 1つはsoap/xmlであり、互換性がない場合、リクエストを拒否することがあります.
最後にもう1つの問題は、呼び出しメソッドパラメータを組み立てることです.
呼び出されたメソッドが組み立てるべきパラメータは、主にメソッドに対応するwsdlのinputを見て、PingメソッドにとってPingRequestです.
pingRequestはBaseRequestを継承しています.PingRequestに相当するのはtoken、username、password、および自身のechoです.そのため、これらの属性をarrayに直接組み立てて押し込むとokになります.
ここでは,複数の入力対象をどのように処理すべきかを実験したことがないので,自分で試してみることができる.Stringタイプに単純な入力パラメータでは、$params=array('arg 0'=>"hello 111");
しかし、私が使っているのは別のwsdlで、その入力パラメータのwsdlは(spring+cxf+aegisデータバインドを使用して生成されます):
対応関係を見てみましょう.何か法則が見えるかどうか.複雑なオブジェクトの場合、arrayを階層的にネストすることができます.この記事を参照してください:PHP SOAPが複雑なオブジェクトにどのように伝達されるか
最後に注意します.
php webserviceを使用する場合は、php_が開いていることを確認する必要があります.soap、php_curlの拡張(php.ini)
phpのsoap clientおよびそのoptionパラメータについては、公式サイト:http://www.php.net/manual/en/soapclient.soapclient.phpを参照してください.
phpを使用するにはxdebugを構成してデバッグし、オブジェクトの値を見ることができるようにしたほうがいいです.かなり分かりやすいです.
SoapClientで送信されたrequestのxmlは、問題があるかどうか、問題がどこにあるかを一目で知ることができます.
詳細はxdebugなどの文章を見ることができます.
さらにphp呼び出しの時にtry,catchを追加しexceptionを出力すると、直接異常を走るよりも出力の結果が詳細になるようです.
そこで、問題が発生したときにcatchを使って、詳細な異常情報を見ることができることをお勧めします.
またspringパブリッシュwebserviceやspring+cxfパブリッシュwebserviceに問題がある場合は、関連記事を探してみてください.ここは住所を貼らない.私もcxfを紹介したことがあります.
まとめてみると、エラーの原因は、今回webserviceが手書きxsdを使用しているため、xsdを手書きで書いてから生成したインタフェースとオブジェクトがlocation設定に互換性がないためです.
参照先:
unable-parse-url
nusoap-how-to-change-content-type-of-request
やっとPHP呼び出しSOAP中のいろいろな問題を解決しました
xmlオンラインフォーマットのツールを共有する:http://www.shell-tools.net/index.php?op=xml_format
Java呼び出しパブリッシュのwebservice、問題なし、ツールSOAP UI呼び出し、問題なし、
同じphpコードでgoogleを呼び出す天気サービスは大丈夫です.私たちのwsdlを呼び出すのはだめです.
手探りでデバッグした結果、以下の問題と解決の過程が見つかりました.
最初にリリースされたwsdlは次のとおりです.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:sch="http://www.phpxiaoxin.com/doorway" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.phpxiaoxin.com/doorway" targetNamespace="http://www.phpxiaoxin.com/doorway">
<wsdl:types>
<s:schema xmlns:dw="http://www.phpxiaoxin.com/doorway" xmlns:s="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.phpxiaoxin.com/doorway">
<s:complexType name="Error">
<s:attribute name="Code" type="s:string" use="required"/>
<s:attribute name="Message" type="s:string" use="required"/>
</s:complexType>
<s:simpleType name="Status">
<s:restriction base="s:string">
<s:enumeration value="Successful"/>
<s:enumeration value="Failed"/>
</s:restriction>
</s:simpleType>
<s:complexType abstract="true" name="BaseRequest">
<s:attribute name="Token" type="s:string" use="required"/>
<s:attribute name="UserName" type="s:string" use="required"/>
<s:attribute name="Password" type="s:string" use="required"/>
</s:complexType>
<s:complexType abstract="true" name="BaseResponse">
<s:sequence>
<s:element minOccurs="0" name="Error" type="dw:Error"/>
</s:sequence>
<s:attribute name="Token" type="s:string" use="required"/>
<s:attribute name="Status" type="dw:Status" use="required"/>
</s:complexType>
<s:complexType name="StatusResponse">
<s:complexContent>
<s:extension base="dw:BaseResponse"/>
</s:complexContent>
</s:complexType>
<s:attribute name="RatePlanCode" type="s:string" use="required"/>
<s:attribute name="RoomTypeCode" type="s:string" use="required"/>
<s:attribute name="NumberOfUnits" type="s:int" use="required"/>
<s:attribute name="HotelCode" type="s:string" use="required"/>
<s:attribute name="DistributorReservationId" type="s:string" use="required"/>
</s:complexType>
<s:element name="PingRequest">
<s:complexType>
<s:complexContent>
<s:extension base="dw:BaseRequest">
<s:attribute name="Echo" type="s:string" use="required"/>
</s:extension>
</s:complexContent>
</s:complexType>
</s:element>
<s:element name="PingResponse">
<s:complexType>
<s:complexContent>
<s:extension base="dw:StatusResponse">
<s:attribute name="Echo" type="s:string" use="required"/>
</s:extension>
</s:complexContent>
</s:complexType>
</s:element>
</s:schema>
</wsdl:types>
<wsdl:message name="PingResponse">
<wsdl:part element="tns:PingResponse" name="PingResponse">
</wsdl:part>
</wsdl:message>
<wsdl:message name="PingRequest">
<wsdl:part element="tns:PingRequest" name="PingRequest">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="Doorway">
<wsdl:operation name="Ping">
<wsdl:input message="tns:PingRequest" name="PingRequest">
</wsdl:input>
<wsdl:output message="tns:PingResponse" name="PingResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="DoorwaySoap11" type="tns:Doorway">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="Ping">
<soap:operation soapAction=""/>
<wsdl:input name="PingRequest">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="PingResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="HotelDoorwayService">
<wsdl:port binding="tns:DoorwaySoap11" name="DoorwaySoap11">
<soap:address location="/soap/doorway/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
ここでは、PingをPingRequestとPingResponseとして入力する方法を定義します.PingRequestにはechoのプロパティが含まれ、BaseRequestのオブジェクトが統合されます.
php呼び出しを使用するコードを次に示します.
<?php
ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache
$wsdl="http://10.10.10.10:8888/doorway/soap/doorway/doorway.wsdl";
$soap=new SoapClient($wsdl, array( 'trace'=>true,'cache_wsdl'=>WSDL_CACHE_NONE, 'soap_version' => SOAP_1_1));
$method="Ping";
$params = array('Token'=>'E30ED3AA-65DE-48F9-BEA4-BA021B119625','UserName'=>'cccc','Password'=>'pppp', 'Echo'=>'hello');
try{
$result=$soap->$method($params);
}catch(Exception $e) {
echo "Exception: " . $e->getMessage();
}
//$result stdClass , echo $result , 。
echo $result->Echo;
?>
最初に呼び出したときに取得したエラーはPingメソッドが見つからず、その後どのように解決されたのか分かりません.
後にSoapClientの呼び出しパラメータWSDL_が追加されましたCACHE_NONEは、サーバがwsdlを変更しても更新できないように、soap呼び出し時にwsdをキャッシュしないようにします.このパラメータを設定すると、呼び出すたびにwsdlファイルが再loadされるため、javaのlogを監視するとgetリクエストが取得されます.最初はwsdlを呼び出すリクエストだと思っていましたが、wsdlのリクエストを持っていることに気づきました.
このチェックボックスを過ぎると、次のエラーが発生します.Unable to parse URL
この原因はgoogleを経てwsdlに問題があることを発見しました:
ここにwsdl会:
この方法でjava呼び出しを使うのは問題ありませんが、php呼び出しを使うのはだめです.さらに誤ったヒント情報を加えると、SoapClientはこのlocationを知能的に解析していないため、soapのアドレス(ここではアドレスと呼ばれていますが、実は私もどういう意味なのか分かりません.wsdlのプロトコルを見て理解したいと思っています.)を呼び出すことはできません.
上記の方法では、SoapClient呼び出しにパラメータを追加します:location=>"http://www.phpxiaoxin.com/soap/doorway"
しかし、この方法は明らかによくありません.より良い方法は、生成されたwsdlでlocationパラメータを直接絶対urlアドレスに設定することです.相対的ではなく、空ではありません.
もう一つの詳細はsoapですversion,分为:SOAP_1_1,SOAP_1_2この2つのヘッダは異なり、1つはtext/xml 1つはsoap/xmlであり、互換性がない場合、リクエストを拒否することがあります.
最後にもう1つの問題は、呼び出しメソッドパラメータを組み立てることです.
呼び出されたメソッドが組み立てるべきパラメータは、主にメソッドに対応するwsdlのinputを見て、PingメソッドにとってPingRequestです.
pingRequestはBaseRequestを継承しています.PingRequestに相当するのはtoken、username、password、および自身のechoです.そのため、これらの属性をarrayに直接組み立てて押し込むとokになります.
ここでは,複数の入力対象をどのように処理すべきかを実験したことがないので,自分で試してみることができる.Stringタイプに単純な入力パラメータでは、$params=array('arg 0'=>"hello 111");
しかし、私が使っているのは別のwsdlで、その入力パラメータのwsdlは(spring+cxf+aegisデータバインドを使用して生成されます):
<xsd:complexType name="sayHello">
<xsd:sequence>
<xsd:element minOccurs="0" name="arg0" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
対応関係を見てみましょう.何か法則が見えるかどうか.複雑なオブジェクトの場合、arrayを階層的にネストすることができます.この記事を参照してください:PHP SOAPが複雑なオブジェクトにどのように伝達されるか
最後に注意します.
php webserviceを使用する場合は、php_が開いていることを確認する必要があります.soap、php_curlの拡張(php.ini)
phpのsoap clientおよびそのoptionパラメータについては、公式サイト:http://www.php.net/manual/en/soapclient.soapclient.phpを参照してください.
phpを使用するにはxdebugを構成してデバッグし、オブジェクトの値を見ることができるようにしたほうがいいです.かなり分かりやすいです.
SoapClientで送信されたrequestのxmlは、問題があるかどうか、問題がどこにあるかを一目で知ることができます.
詳細はxdebugなどの文章を見ることができます.
さらにphp呼び出しの時にtry,catchを追加しexceptionを出力すると、直接異常を走るよりも出力の結果が詳細になるようです.
そこで、問題が発生したときにcatchを使って、詳細な異常情報を見ることができることをお勧めします.
またspringパブリッシュwebserviceやspring+cxfパブリッシュwebserviceに問題がある場合は、関連記事を探してみてください.ここは住所を貼らない.私もcxfを紹介したことがあります.
まとめてみると、エラーの原因は、今回webserviceが手書きxsdを使用しているため、xsdを手書きで書いてから生成したインタフェースとオブジェクトがlocation設定に互換性がないためです.
参照先:
unable-parse-url
nusoap-how-to-change-content-type-of-request
やっとPHP呼び出しSOAP中のいろいろな問題を解決しました
xmlオンラインフォーマットのツールを共有する:http://www.shell-tools.net/index.php?op=xml_format