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

哦,我明白了..是将告诉你如何去做的教程。

于 2012-07-05T09:35:02.923 回答
0

在服务器端处理该对象怎么样,当服务器应用程序获取您的对象时,服务器源代码如何处理该对象?

于 2013-11-23T14:32:41.593 回答