我可以使用 KSoap2 发送静态 XML 文件作为请求吗
Can I use KSoap2 to send a static XML file as a request
我正在使用 KSoap2 尝试构建下面的 XML 文件请求。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_5="www.444.com">
<soapenv:Header/>
<soapenv:Body>
<_5:GetStaff>
<!--Optional:-->
<_5:Request>
<!--Optional:-->
<_5:SourceCredentials>
<!--Optional:-->
<_5:SourceName>sourcename</_5:SourceName>
<!--Optional:-->
<_5:Password>password=</_5:Password>
<!--Optional:-->
<_5:SiteIDs>
<!--Zero or more repetitions:-->
<_5:int>1111</_5:int>
</_5:SiteIDs>
</_5:SourceCredentials>
</_5:Request>
</_5:GetStaff>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用它并生成以下代码,但似乎子元素给我带来了问题。我是 Ksoap2 的新手,找不到清晰的结构化解决方案。
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("SourceName", "sourcename");
request.addProperty("Password", "password=");
request.addProperty("int", "1111");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE htse = new HttpTransportSE(URL);
try{
htse.call(SOAP_ACTION, envelope);
SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();
ret = resultString.toString();
}
catch(Exception e){
e.printStackTrace();
}
我将如何使用 KSoap2 构建树以便正确访问子元素。如果没有此结构,api 将无法正确响应。
有没有办法直接从 xml 资源中发送这个 xml 文件?
或者有其他方法吗?
更新:尝试为复杂元素制作 classes
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import java.util.Hashtable;
/**
* Created by randypfohl on 7/15/15.
*/
public class SourceCredentials implements KvmSerializable {
//Xml variables
private String sourceName;
private String password;
private SiteIDs site;
public SourceCredentials() {
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public String getSourceName() {
return this.sourceName;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public void setSiteIDs(SiteIDs site) {
this.site = site;
}
@Override
public Object getProperty(int index) {
Object toreturn = null;
switch (index) {
case 0:
toreturn = this.sourceName;
case 1:
toreturn = this.password;
case 2:
toreturn = this.site;
default:
break;
}
return toreturn;
}
@Override
public int getPropertyCount () {
return 3;
}
@Override
public void setProperty ( int index, Object value){
switch (index) {
case 0:
this.sourceName = value.toString();
break;
case 1:
this.password = value.toString();
break;
case 2:
site.setProperty(0, value);
break;
}
}
@Override
public void getPropertyInfo ( int index, Hashtable hashtable, PropertyInfo propertyInfo){
switch (index) {
case 0:
propertyInfo.name = "SourceName";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 1:
propertyInfo.name = "Password";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 2:
propertyInfo.name = "SiteIDs";
propertyInfo.type = SiteIDs.class;
break;
default:
break;
}
}
@Override
public String getInnerText () {
return null;
}
@Override
public void setInnerText (String s){
}
}
这是站点 ID class。
import java.util.Hashtable;
import java.util.Vector;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class SiteIDs extends Vector<Integer> implements KvmSerializable {
@Override
public Object getProperty(int arg0) {
return this.get(arg0);
}
@Override
public String getInnerText () {
return null;
}
@Override
public void setInnerText (String s){
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
arg2.name = "int";
arg2.type = PropertyInfo.INTEGER_CLASS;
}
@Override
public void setProperty(int arg0, Object arg1) {
this.add(Integer.valueOf(arg1.toString()));
}
}
这是我创建的代码。
/* 字符串 ret ="fail";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SourceCredentials sourceCredentials = new SourceCredentials();
sourceCredentials.setProperty(0, "name");
sourceCredentials.setProperty(1, "password");
SiteIDs siteIDS = new SiteIDs();
siteIDS.setProperty(0, "1100");
sourceCredentials.setSiteIDs(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(NAMESPACE, SourceCredentials.class.getSimpleName(), SourceCredentials.class);
envelope.addMapping(NAMESPACE, SiteIDs.class.getSimpleName(), SiteIDs.class);
try{
HttpTransportSE htse = new HttpTransportSE(URL);
htse.debug = true;
htse.setXmlVersionTag("<!--?xml version=\"1.0\" encoding= \"UTF-8\" ?-->");
htse.call(SOAP_ACTION, envelope);
SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();
ret = resultString.toString();
System.out.println(ret);
}
catch(Exception e){
e.printStackTrace();
}
return ret;
我想不通。我似乎总是得到一个奇怪的错误。
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@b1eb5d78
您必须创建可序列化对象并将它们传递给 SOAP 对象。
public class SourceCredentials implements KvmSerializable {
//Xml variables
private String sourceName;
private String password;
private SiteIDs siteIDs;
public SourceCredentials(){
}
public setSourceName(String sourceName){
this.sourceName = sourceName;
}
public String getSourceName(){
return this.sourceName;
}
public setPassword(String password){
this.password = password;
}
public String getPassword(){
return this.password;
}
public setSiteIDs(SiteIDs siteIDs){
this.siteIDs = siteIDs;
}
public getSiteIDs(){
return this.siteIDs;
}
@Override
public Object getProperty(int index) {
switch(index){
case 0:
return this.sourceName;
case 1:
return this.password;
case 2:
return this.siteIDs;
default:
break
}
@Override
public int getPropertyCount() {
return 3;
@Override
public void setProperty(int index, Object value) {
switch(index){
case 0:
this.sourceName = value.toString();
break;
case 1:
this.password = value.toString();
break;
case 2:
this.siteIDs = (SiteIDs) value;
break;
}
}
@Override
public void getPropertyInfo(int index, Hashtable hashtable, PropertyInfo propertyInfo) {
switch (index){
case 0:
propertyInfo.name = "SourceName";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 1:
propertyInfo.name = "Password";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 2:
propertyInfo.name = "SiteIDs";
propertyInfo.type = PropertyInfo.OBJECT_CLASS;
break;
default:
break;
}
}
@Override
public String getInnerText() {
return null;
}
@Override
public void setInnerText(String s) {
}
你对 SiteIds 做同样的事情
然后传递 Soap 对象。
编辑
你试试这个?
SourceCredentials sourceCredentials = new SourceCredentials();
//Create SiteIDs KvmSerializable object
SiteIDs siteIDS = new SiteIDS();
siteIDS.setInt(1111)
//Setters
sourceCredentials.setSourceName("sourcename");
sourceCredentials.setPassword("password=");
sourceCredentials.setSiteIDS(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);
编辑 2
试试这个
SiteIDS.java
public class SiteIDs implements KvmSerializable {
private List<Integer> Int; //change name of variable, int it's a reserved name
public SiteIDs() {
}
public List<Integer> getInt() {
return Int;
}
public void setInt(List<Integer> anInt) {
Int = anInt;
}
@Override
public Object getProperty(int i) {
switch (i){
case 0:
return Int;
default:
break;
}
return null;
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void setProperty(int i, Object value) {
switch (i) {
case 0:
this.Int = (List<Integer>) value;
break;
default:
break;
}
}
@Override
public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {
switch (i) {
case 0:
propertyInfo.name = "int";
propertyInfo.type = List.class;
break;
default:
break;
}
}
@Override
public String getInnerText() {
return null;
}
@Override
public void setInnerText(String s) {
}
还有这个:
SourceCredentials sourceCredentials = new SourceCredentials();
//Create SiteIDs KvmSerializable object
SiteIDs siteIDS = new SiteIDS();
List<Integer> ints = new ArrayList<Integer>();
ints.add(1111); //add one o more ints
siteIDS.setInts(ints);
//Setters
sourceCredentials.setSourceName("sourcename");
sourceCredentials.setPassword("password=");
sourceCredentials.setSiteIDS(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);
我正在使用 KSoap2 尝试构建下面的 XML 文件请求。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:_5="www.444.com">
<soapenv:Header/>
<soapenv:Body>
<_5:GetStaff>
<!--Optional:-->
<_5:Request>
<!--Optional:-->
<_5:SourceCredentials>
<!--Optional:-->
<_5:SourceName>sourcename</_5:SourceName>
<!--Optional:-->
<_5:Password>password=</_5:Password>
<!--Optional:-->
<_5:SiteIDs>
<!--Zero or more repetitions:-->
<_5:int>1111</_5:int>
</_5:SiteIDs>
</_5:SourceCredentials>
</_5:Request>
</_5:GetStaff>
</soapenv:Body>
</soapenv:Envelope>
我尝试使用它并生成以下代码,但似乎子元素给我带来了问题。我是 Ksoap2 的新手,找不到清晰的结构化解决方案。
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("SourceName", "sourcename");
request.addProperty("Password", "password=");
request.addProperty("int", "1111");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE htse = new HttpTransportSE(URL);
try{
htse.call(SOAP_ACTION, envelope);
SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();
ret = resultString.toString();
}
catch(Exception e){
e.printStackTrace();
}
我将如何使用 KSoap2 构建树以便正确访问子元素。如果没有此结构,api 将无法正确响应。
有没有办法直接从 xml 资源中发送这个 xml 文件?
或者有其他方法吗?
更新:尝试为复杂元素制作 classes
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
import java.util.Hashtable;
/**
* Created by randypfohl on 7/15/15.
*/
public class SourceCredentials implements KvmSerializable {
//Xml variables
private String sourceName;
private String password;
private SiteIDs site;
public SourceCredentials() {
}
public void setSourceName(String sourceName) {
this.sourceName = sourceName;
}
public String getSourceName() {
return this.sourceName;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public void setSiteIDs(SiteIDs site) {
this.site = site;
}
@Override
public Object getProperty(int index) {
Object toreturn = null;
switch (index) {
case 0:
toreturn = this.sourceName;
case 1:
toreturn = this.password;
case 2:
toreturn = this.site;
default:
break;
}
return toreturn;
}
@Override
public int getPropertyCount () {
return 3;
}
@Override
public void setProperty ( int index, Object value){
switch (index) {
case 0:
this.sourceName = value.toString();
break;
case 1:
this.password = value.toString();
break;
case 2:
site.setProperty(0, value);
break;
}
}
@Override
public void getPropertyInfo ( int index, Hashtable hashtable, PropertyInfo propertyInfo){
switch (index) {
case 0:
propertyInfo.name = "SourceName";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 1:
propertyInfo.name = "Password";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 2:
propertyInfo.name = "SiteIDs";
propertyInfo.type = SiteIDs.class;
break;
default:
break;
}
}
@Override
public String getInnerText () {
return null;
}
@Override
public void setInnerText (String s){
}
}
这是站点 ID class。
import java.util.Hashtable;
import java.util.Vector;
import org.ksoap2.serialization.KvmSerializable;
import org.ksoap2.serialization.PropertyInfo;
public class SiteIDs extends Vector<Integer> implements KvmSerializable {
@Override
public Object getProperty(int arg0) {
return this.get(arg0);
}
@Override
public String getInnerText () {
return null;
}
@Override
public void setInnerText (String s){
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) {
arg2.name = "int";
arg2.type = PropertyInfo.INTEGER_CLASS;
}
@Override
public void setProperty(int arg0, Object arg1) {
this.add(Integer.valueOf(arg1.toString()));
}
}
这是我创建的代码。
/* 字符串 ret ="fail";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SourceCredentials sourceCredentials = new SourceCredentials();
sourceCredentials.setProperty(0, "name");
sourceCredentials.setProperty(1, "password");
SiteIDs siteIDS = new SiteIDs();
siteIDS.setProperty(0, "1100");
sourceCredentials.setSiteIDs(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
envelope.addMapping(NAMESPACE, SourceCredentials.class.getSimpleName(), SourceCredentials.class);
envelope.addMapping(NAMESPACE, SiteIDs.class.getSimpleName(), SiteIDs.class);
try{
HttpTransportSE htse = new HttpTransportSE(URL);
htse.debug = true;
htse.setXmlVersionTag("<!--?xml version=\"1.0\" encoding= \"UTF-8\" ?-->");
htse.call(SOAP_ACTION, envelope);
SoapPrimitive resultString = (SoapPrimitive) envelope.getResponse();
ret = resultString.toString();
System.out.println(ret);
}
catch(Exception e){
e.printStackTrace();
}
return ret;
我想不通。我似乎总是得到一个奇怪的错误。
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@b1eb5d78
您必须创建可序列化对象并将它们传递给 SOAP 对象。
public class SourceCredentials implements KvmSerializable {
//Xml variables
private String sourceName;
private String password;
private SiteIDs siteIDs;
public SourceCredentials(){
}
public setSourceName(String sourceName){
this.sourceName = sourceName;
}
public String getSourceName(){
return this.sourceName;
}
public setPassword(String password){
this.password = password;
}
public String getPassword(){
return this.password;
}
public setSiteIDs(SiteIDs siteIDs){
this.siteIDs = siteIDs;
}
public getSiteIDs(){
return this.siteIDs;
}
@Override
public Object getProperty(int index) {
switch(index){
case 0:
return this.sourceName;
case 1:
return this.password;
case 2:
return this.siteIDs;
default:
break
}
@Override
public int getPropertyCount() {
return 3;
@Override
public void setProperty(int index, Object value) {
switch(index){
case 0:
this.sourceName = value.toString();
break;
case 1:
this.password = value.toString();
break;
case 2:
this.siteIDs = (SiteIDs) value;
break;
}
}
@Override
public void getPropertyInfo(int index, Hashtable hashtable, PropertyInfo propertyInfo) {
switch (index){
case 0:
propertyInfo.name = "SourceName";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 1:
propertyInfo.name = "Password";
propertyInfo.type = PropertyInfo.STRING_CLASS;
break;
case 2:
propertyInfo.name = "SiteIDs";
propertyInfo.type = PropertyInfo.OBJECT_CLASS;
break;
default:
break;
}
}
@Override
public String getInnerText() {
return null;
}
@Override
public void setInnerText(String s) {
}
你对 SiteIds 做同样的事情
然后传递 Soap 对象。
编辑
你试试这个?
SourceCredentials sourceCredentials = new SourceCredentials();
//Create SiteIDs KvmSerializable object
SiteIDs siteIDS = new SiteIDS();
siteIDS.setInt(1111)
//Setters
sourceCredentials.setSourceName("sourcename");
sourceCredentials.setPassword("password=");
sourceCredentials.setSiteIDS(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);
编辑 2
试试这个
SiteIDS.java
public class SiteIDs implements KvmSerializable {
private List<Integer> Int; //change name of variable, int it's a reserved name
public SiteIDs() {
}
public List<Integer> getInt() {
return Int;
}
public void setInt(List<Integer> anInt) {
Int = anInt;
}
@Override
public Object getProperty(int i) {
switch (i){
case 0:
return Int;
default:
break;
}
return null;
}
@Override
public int getPropertyCount() {
return 1;
}
@Override
public void setProperty(int i, Object value) {
switch (i) {
case 0:
this.Int = (List<Integer>) value;
break;
default:
break;
}
}
@Override
public void getPropertyInfo(int i, Hashtable hashtable, PropertyInfo propertyInfo) {
switch (i) {
case 0:
propertyInfo.name = "int";
propertyInfo.type = List.class;
break;
default:
break;
}
}
@Override
public String getInnerText() {
return null;
}
@Override
public void setInnerText(String s) {
}
还有这个:
SourceCredentials sourceCredentials = new SourceCredentials();
//Create SiteIDs KvmSerializable object
SiteIDs siteIDS = new SiteIDS();
List<Integer> ints = new ArrayList<Integer>();
ints.add(1111); //add one o more ints
siteIDS.setInts(ints);
//Setters
sourceCredentials.setSourceName("sourcename");
sourceCredentials.setPassword("password=");
sourceCredentials.setSiteIDS(siteIDS);
request.addProperty("SourceCredentials", sourceCredentials);