gpt4 book ai didi

android - Ksoap2 将复杂对象作为参数传递

转载 作者:行者123 更新时间:2023-11-30 04:08:13 25 4
gpt4 key购买 nike

我通过随请求一起发送对象来与网络服务通信。

这是网络服务的 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 天多了!

最佳答案

为什么不用简单的方法。

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!!! ");

}

关于android - Ksoap2 将复杂对象作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11283387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com