PHP ベースの Web サービスを使用する Android アプリケーションを開発しています。これについて非常に多くの質問があることは知っていますが、3日間読んだ後、答えが役に立たなかったと言えます.
一方では、次のような php サービスがあります。
サーバー側のツリー フォルダー:
http://IP/WSexample/wsdl/
- hello_server.php
- hello.wsdl
PHP 部分 (hello_server.php):
if (!extension_loaded("soap")) {
dl("php_soap.dll");
}
ini_set("soap.wsdl_cache_enabled", "0");
$server = new SoapServer("hello.wsdl");
function sayHello($yourName = '') {
if (empty($yourName)) $yourName = "Mundo";
return "Hello, ".$yourName;
}
$server->addFunction("sayHello");
$server->handle();
XML 部分 (hello.wsdl):
<?xml version="1.0" encoding="UTF-8"?>
<definitions name="HelloService"
targetNamespace="http://XX.XX.XX.XX/WSexample/wsdl/hello.wsdl"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://XX.XX.XX.XX/WSexample/wsdl/hello.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<message name="SayHelloRequest">
<part name="firstName" type="xsd:string"/>
</message>
<message name="SayHelloResponse">
<part name="greeting" type="xsd:string"/>
</message>
<portType name="Hello_PortType">
<operation name="sayHello">
<input message="tns:SayHelloRequest"/>
<output message="tns:SayHelloResponse"/>
</operation>
</portType>
<binding name="Hello_Binding" type="tns:Hello_PortType">
<soap:binding style="rpc"
transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="sayHello">
<soap:operation soapAction="sayHello"/>
<input>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</input>
<output>
<soap:body
encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
namespace="urn:examples:helloservice"
use="encoded"/>
</output>
</operation>
</binding>
<service name="Hello_Service">
<documentation>WSDL File for HelloService</documentation>
<port binding="tns:Hello_Binding" name="Hello_Port">
<soap:address
location="http://XX.XX.XX.XX/WSexample/wsdl/hello_server.php"/>
</port>
</service>
</definitions>
自分のphpクライアントで試してみると、サーバーは正常に動作し、Helloと私が付けた名前を返します。 http://validwsdl.comで試しても、適切なデータが取得されます... Androidが私の問題です。 ..
データを取得する単純なアクティビティがありますが、HttpTransportSE オブジェクトのメソッド呼び出しを使用すると、常に XmlPullParserException が返されます。例外は言う:
org.xmlpull.v1.XmlPullParserException: expected: START_TAG {http://schemas.xmlsoap.org/soap/envelope/}Envelope (position:START_TAG <definitions name='HelloService' targetNamespace='http://XX.XX.XX.XX/WSexample/wsdl/hello.wsdl'>@7:49 in java.io.InputStreamReader@405701b0)
Android コード:
public class MainActivity extends Activity {
public static final String NAMESPACE="urn:examples:helloservice";
public static final String METHOD_NAME ="sayHello";
public static final String URL = "http://XX.XX.XX.XX/WSexample/wsdl/hello.wsdl";
public static final String SOAP_ACTION = "sayHello";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = (TextView) findViewById(R.id.tv);
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("firstName", "John");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE ht = new HttpTransportSE(URL);
try {
ht.call(SOAP_ACTION, envelope);
SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
tv.setText("Mensaje: "+response.toString());
} catch (XmlPullParserException i){
Log.e("MI_ERROR", i.getMessage());
}catch(Exception e) {
Log.e("MI_ERROR", e.getMessage());
e.printStackTrace();
}
}
}
URL、NAMESPACE、METHOD_NAME、SOAP_ACTION の属性に関係があると思います。それらを他のオプションに変更しようとしましたが、成功しませんでした。
URL属性を次のように変更すると:
public static final String URL = "http://XX.XX.XX.XX/WSexample/wsdl/hello_server.php";
例外は次のように変更されます。
org.xmlpull.v1.XmlPullParserException: unexpected type (position:END_DOCUMENT null@1:0 in java.io.InputStreamReader@40570008)
助けてください!!!