- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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 文件?
或者有别的办法吗?
更新:尝试为复杂元素创建类
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){
}
}
这是 siteids 类。
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()));
}
}
这是我创建的代码。
/* String ret ="失败";
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) {
}
并且您对 SiteId 执行相同的操作
然后传递 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);
关于java - 我可以使用 KSoap2 将静态 XML 文件作为请求发送吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438114/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在 C# 静态方法中是否有一种方法可以引用定义该方法的类型? 在实例方法中,您可以通过以下方式确定类型: public void Foo() { Type type = this.GetTyp
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: <Window
任何人都知道如何在共享/静态函数中动态加载控件?该函数本身位于 mustinherit/abstract 类中。 (这是 VB 中的 ASP.NET 项目)我想做这样的事情: VB: Publ
在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当您更改任何 API,那么编译器会告诉您该更改破坏了什么。 我可以想象用运行时/弱类型语言编写代码......但我无法想象没有编译器的帮
正如我的名字所暗示的,我是一名 .NET 开发人员,但我对 Java 的兴趣越来越大,并且我有兴趣学习更多其他语言,因为这有助于我学习更多关于编程的知识。 无论如何,我的问题是:不带参数/不使用状态的
我在java中使用WireMock来 stub POST请求。该请求返回一个存储在我本地的 json 正文文件。 stub 看起来像这样: wireMockServer.stubFor(get(url
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
这个问题已经有答案了: What is the difference between dynamic and static polymorphism in Java? (14 个回答) 已关闭 4 年
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Static initializer in Java 我想知道这个静态的东西(抱歉,这是我第一次遇到这个)对一个类有
如果c++应用程序是按以下方式组织的 //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //fil
我有一个抽象类(AvergedDataRecord),我需要进一步抽象(DataRecord),这样我就可以将它扩展到原始类和一个新的具体类(SummedDataRecord),并且我在获取某些方法时
我正在尝试制作一个字符串枚举。这是我到目前为止所得到的, private class TypedEnum : IEnumerable { public IEnumerator GetEnume
我选修了一门名为“安全代码”的类(class),在下一个作业中,我们应该对一些 C 文件和 JavaEE Web 项目进行静态/动态分析。 我检查了“源监视器”并在 C 文件上运行它,但是(除非我不知
我有两个类,一个是登录类,一个是用户类。在 loggedIn 类中,我想显示我在用户登录时所做的共享首选项。 loginPrefs = getSharedPreferences("loginprefe
我在同一个 Activity 中有两个静态 fragment ,在“fragmentA”中我有一个自定义列表,当一个项目被点击时必须在“fragmentB”中出现一个细节,细节只在我改变屏幕方向时出现
在 Java 中是未修改方法变量,缺少final,每次都重新初始化限定符 静态方法 实例方法 如果 1. 或 2.(或两者)的答案是 final 限定符允许 Java 执行优化并存储方法变量只有一次?
我有两个类相互交互。第一个是中心的,如下: public class Datenbank { double winkelPanel = 0; double groessePanel = 0; doub
我有一个 mysql 数据库,它连接基于 Web 的 php 应用程序和 FoxPro 应用程序(是的,foxpro)。在之前的“开发人员”被解雇后开始处理这个问题。 无论如何,我熟悉 AES_Enc
我是一名优秀的程序员,十分优秀!