1

だから私はSOAPを介してAndroidアプリからアクセスしたいPHP Webサービスを持っています。PHPクライアントをローカルで構築し、Webサービス(オンライン)からリクエストしようとしたため、Webサービスが正常に機能していることは確かです。PHPクライアントは正しいデータを取得できました。問題は、エンベロープの「getResponse()」を試行したときの NullPointerException です。また、エンベロープの「bodyIn」も null です。HttpTransportSEのresponseDumpを出力してみたところ、WSDLファイルそのものが表示されました。WSDL ファイルではなく、応答エンベロープを返すべきではありませんか?

Android クライアント:

package com.franzsarmiento.shorecloudsurvey;

import java.io.IOException;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;

public class MainMenu extends Activity {



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_menu);

        new DownloadNewSurveys().execute();
    }

    private class DownloadNewSurveys extends AsyncTask<Void,Void,Void> {

        private final static String NAMESPACE = "http://203.177.73.175:8080/";
        private final static String METHOD_NAME = "getSid";
        private final static String SOAP_ACTION = "http://203.177.73.175:8080/getSid";
        private final static String URL = "http://203.177.73.175:8080/sid.wsdl";

        @Override
        protected Void doInBackground(Void... arg0) {

            SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);

            SoapSerializationEnvelope envelope = new
                    SoapSerializationEnvelope(SoapEnvelope.VER11);          
            envelope.setOutputSoapObject(request);

            HttpTransportSE ht = new HttpTransportSE(URL);
            ht.debug = true;

            try {
                ht.call(SOAP_ACTION, envelope);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }

            SoapObject response = null;

            System.out.println(ht.responseDump);

            try {
                response = (SoapObject)envelope.getResponse();
            } catch (SoapFault e) {
                response = (SoapObject)envelope.bodyIn;
            }

            System.out.println(response);
            return null;
        }

    }

}

WSDL ファイル (これは、responseDump を出力したときに得られるものと同じです):

<definitions name='Sid'

  targetNamespace='http://203.177.73.175:8080/'

  xmlns:tns='http://203.177.73.175:8080/'

  xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'

  xmlns:xsd='http://www.w3.org/2001/XMLSchema'

  xmlns:soapenc='http://schemas.xmlsoap.org/soap/encoding/'

  xmlns:wsdl='http://schemas.xmlsoap.org/wsdl/'

  xmlns='http://schemas.xmlsoap.org/wsdl/'>

<message name='getSidRequest'/>

<message name='getSidResponse'>

  <part name='sidArray' type='tns:ArrayOfinteger[]'/>

</message>

<portType name='SidPortType'>

  <operation name='getSid'>

    <input message='tns:getSidRequest'/>

    <output message='tns:getSidResponse'/>

  </operation>

</portType>

<binding name='SidBinding' type='tns:SidPortType'>

  <soap:binding style='rpc'

    transport='http://schemas.xmlsoap.org/soap/http'/>

  <operation name='getSid'>

    <soap:operation soapAction='getSid'/>

    <input>

      <soap:body use='encoded' namespace='urn:sid'

        encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>

    </input>

    <output>

      <soap:body use='encoded' namespace='urn:sid'

        encodingStyle='http://schemas.xmlsoap.org/soap/encoding/'/>

    </output>

  </operation>

</binding>

<service name='SidService'>

  <port name='SidPort' binding='SidBinding'>

    <soap:address location='http://203.177.73.175:8080/sid_server.php'/>

  </port>

</service>

</definitions>

PHP Web サービス:

<?php 

function getSid() {
    $con = mysql_connect('localhost','fsarmiento','shorecloud') or die (mysql_error());
    $db = mysql_select_db('limesurvey',$con);

    $query = '
        SELECT 
            sid
        FROM
            lime_surveys
    ;';

    $result = mysql_query($query) or die (mysql_error());

    $arrSid = array();

    while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
        $arrSid[] =  intval($row['sid']);
    }

    return $arrSid;

}

ini_set("soap.wsdl_cache_enabled", "0"); // disabling WSDL cache

$server = new SoapServer("sid.wsdl", array('encoding'=>'UTF-8'));

$server->addFunction("getSid");

$server->handle();

?>

また、URLがwsdlファイルではなくPHP Webサービスを指す必要があるといういくつかのソリューションを読みました。私はそれを試しましたが、それでもヌルでした。responseDumpを確認したところ、特殊文字しか表示されませんでした。

4

2 に答える 2

1

あなたに例外があるためにここに到着した人のために:

Log.e("responseDump", transport.responseDump.toString());

またはあなた:

System.out.println(transport.responseDump.toString());

文字列を出力する前に、呼び出しが次のように構成されていることを確認する必要があります。

HttpTransportSE transport = new HttpTransportSE(URL);
transport.debug = true;
transport.call(SOAP_ACTION, envelope);

transport.debug = true;がある場合。transport.call(SOAP_ACTION, エンベロープ)の後; 、あなたはクラッシュし、あなたの弦は燃えます!呼び出しの前に debug を true に設定してください...

于 2013-04-04T00:25:56.803 に答える
1

私は自分の問題を解決しました!PHP Webサービスにアクセスするとき、URLはWSDLファイルではなく、Webサービス自体を指している必要があります。今、私はすでにそれをPHP Webサービスに向けようとしましたが、応答が整数の配列であったためClassCastExceptionが原因であることが判明したエラーはまだ残っています。

SoapObject response = (SoapObject)envelope.getResponse();

しなければならないことは次のとおりです。

Vector<SoapObject> response = (Vector<SoapObject>)envelope.getResponse();
于 2012-09-25T10:26:31.430 に答える