1

リクエストと一緒にオブジェクトを送信して、Webサービスと通信しています。

これは、WebサービスのWSDLの形式です。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<UpdateLocation xmlns="http://tempuri.org/">
  <location>
    <Id>int</Id>
    <TabletId>int</TabletId>
    <SpeedVisibility>boolean</SpeedVisibility>
    <BeltVisibility>boolean</BeltVisibility>
    <LightVisibility>boolean</LightVisibility>
    <ProjectorVisibility>boolean</ProjectorVisibility>
    <DefStart>int</DefStart>
    <DefEnd>int</DefEnd>
    <DefPickerCount>int</DefPickerCount>
    <DefSlotCount>int</DefSlotCount>
    <ServerIP>string</ServerIP>
    <WebURL>string</WebURL>
  </location>
</UpdateLocation>
</soap:Body>
</soap:Envelope>

これは、リクエストを行うための私のJavaコードです。

private void updateSettingsOnServer() {
    SoapObject request = new SoapObject(NAMESPACE, METHOD_UPDATE_SETTINGS);

    Location serverObject = new Location(currentLocation.databaseId, currentLocation.tabletId, currentLocation.isSpeedVisible, currentLocation.isBeltVisible, currentLocation.isLightVisible, currentLocation.isProjectorVisible, currentLocation.slotStarting, currentLocation.slotEnding, prefPickerCount, prefSlotCount, prefServerIPString, prefWebURL);


     PropertyInfo pi = new PropertyInfo();
        pi.setName("serverObject");
        pi.setValue(serverObject);
        pi.setType(serverObject.getClass());
        request.addProperty(pi);




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



    envelope.addMapping(NAMESPACE,"Location",new Location().getClass());


    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);




    try {
        androidHttpTransport.call(SOAP_ACTION_UPDATE_SETTINGS, envelope);




        SoapObject result=(SoapObject)envelope.getResponse(); //To get the data.
        tempText.setText("Received :" + result.toString());

    }
    catch(Exception e)
    {

        tempText.setText("Error");
        //Toast.makeText(context, "Error", Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

}

次の方法で、カスタムクラスKVMSerializableを作成しました。

class Location implements KvmSerializable
{
    public Location(int id, int tabletid, boolean speed, boolean belt, boolean light, boolean projector, int start, int end, int picker, int slot, String server, String web)
    {
        databaseId =id;
        tabletId = tabletid;
        isSpeedVisible = speed;
        isBeltVisible = belt;
        isLightVisible = light;
        isProjectorVisible = projector;
        slotStarting = start;
        slotEnding = end;
        pickerCounting = picker;
        slotCounting = slot;
        serverUrlLink = server;
        webUrlLink = web;


    }

    public Location() {
        // TODO Auto-generated constructor stub
    }

    boolean isSpeedVisible, isLightVisible, isBeltVisible, isProjectorVisible;
    int slotStarting, slotEnding , pickerCounting, slotCounting;
    int databaseId, tabletId;
    String serverUrlLink, webUrlLink;


    public Object getProperty(int arg0) {
        // TODO Auto-generated method stub

         switch(arg0)
            {
            case 0:
                return databaseId;
            case 1:
                return tabletId;
            case 2:
                return isSpeedVisible;
            case 3:
                return isBeltVisible;
            case 4:
                return isLightVisible;
            case 5:
                return isProjectorVisible;
            case 6:
                return slotStarting;
            case 7:
                return slotEnding;
            case 8:
                return pickerCounting;
            case 9:
                return slotCounting;
            case 11:
                return serverUrlLink;
            case 12:
                return webUrlLink;

            }

         return null;
    }


    public int getPropertyCount() {
        // TODO Auto-generated method stub
        return 12;
    }



    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo info) {
        // TODO Auto-generated method stub

        switch(arg0)
        {
        case 0:
            info.type = PropertyInfo.INTEGER_CLASS;
            info.name = "databaseId";
            break;
        case 1:
            info.type = PropertyInfo.INTEGER_CLASS;
            info.name = "tabletId";
            break;
        case 2:
            info.type = PropertyInfo.BOOLEAN_CLASS;
            info.name = "isSpeedVisible";
            break;
        case 3:
            info.type = PropertyInfo.BOOLEAN_CLASS;
            info.name = "isBeltVisible";
            break;
        case 4:
            info.type = PropertyInfo.BOOLEAN_CLASS;
            info.name = "isLightVisible";
            break;
        case 5:
            info.type = PropertyInfo.BOOLEAN_CLASS;
            info.name = "isProjectorVisible";
            break;
        case 6:
            info.type = PropertyInfo.INTEGER_CLASS;
            info.name = "slotStarting";
            break;
        case 7:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "slotEnding";
            break;
        case 8:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "pickerCounting";
            break;
        case 9:
            info.type = PropertyInfo.INTEGER_CLASS;
            info.name = "slotCounting";
            break;
        case 11:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "serverUrlLink";
            break;
        case 12:
            info.type = PropertyInfo.STRING_CLASS;
            info.name = "webUrlLink";
            break;

        default:break;
        }



    }
    public void setProperty(int index, Object value) {
        // TODO Auto-generated method stub

        switch(index)
        {
        case 0:
            databaseId = Integer.parseInt(value.toString());
            break;
        case 1:
            tabletId = Integer.parseInt(value.toString());
            break;
        case 2:
            isSpeedVisible = Boolean.parseBoolean(value.toString());
            break;
        case 3:
            isBeltVisible = Boolean.parseBoolean(value.toString());
            break;
        case 4:
            isLightVisible = Boolean.parseBoolean(value.toString());
            break;
        case 5:
            isProjectorVisible = Boolean.parseBoolean(value.toString());
            break;
        case 6:
            slotStarting = Integer.parseInt(value.toString());
            break;
        case 7:
            slotEnding = Integer.parseInt(value.toString());
            break;
        case 8:
            pickerCounting = Integer.parseInt(value.toString());
            break;
        case 9:
            slotCounting = Integer.parseInt(value.toString());
            break;
        case 10:
            serverUrlLink = (value.toString());
            break;
        case 11:
            webUrlLink = (value.toString());
            break;


        default:
            break;
        }

    }
}

しかし、残念ながら、それは機能していません。

このエラーが発生します。私はよく見回しましたが、それでもこれに対する解決策を見つけることができませんでした。

SoapFault - faultcode: 'soap:Server' faultstring: 'Server was unable to process request. ---> Object reference not set to an instance of an object.' faultactor: 'null' detail: org.kxml2.kdom.Node@410cdac8

助けてください。私は今、この同じ問題に3日以上立ち往生しています!

4

3 に答える 3

1

簡単な方法を使用してみませんか。

final SoapObject request = new SoapObject(AppConsts.NAMESPACE,
                usecaseString);
        request.addProperty("Id", 1);
        request.addProperty("TabletId", 2);
        request.addProperty("SpeedVisibility", true);

WebURL まで同様です。その後、このコードを使用できます。

final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        final HttpTransportSE androidHttpTransport = new HttpTransportSE(
                AppConsts.URL);
        androidHttpTransport.debug = true;
        String soapAction = AppConsts.NAMESPACE + usecaseString;

        try {
            androidHttpTransport.call(soapAction, envelope);
            SoapPrimitive resultSoapPrimitive;
            resultSoapPrimitive = (SoapPrimitive) envelope.getResponse();
            if (resultSoapPrimitive != null) {
                result = resultSoapPrimitive.toString();
                if (AppConsts.ENABLE_LOG)
                    Log.d(AppConsts.GAME_TITLE, "result json : " + result);
            } else {
                if (AppConsts.ENABLE_LOG)
                    Log.d(AppConsts.GAME_TITLE, "result json is NULL!!! ");

            }
于 2012-07-05T06:29:15.623 に答える
0

サーバー側でそのオブジェクトを処理する場合、サーバー アプリケーションがオブジェクトを取得したときに、サーバー ソース コードはそのオブジェクトをどのように処理するのでしょうか?

于 2013-11-23T14:32:41.593 に答える
0

ああ、なるほど..これは、その方法を説明するチュートリアルです。

于 2012-07-05T09:35:02.923 に答える