我在从Android设备向第三方公司服务器(服务器无法更改)发送复杂的SOAP请求时遇到问题。我正在使用KSOAP2库并且缺少其中一个属性(服务器在klausimai
为null
时发生错误。当KSOAP2生成XML时,我的请求中的相同命名空间也会重复多次,因为我传递了很多PropertyInfo
。我的问题是,为什么服务器可以看到其他属性(它也会给出null
个错误)但是看不到klausimai
?
服务器公司提供的WS的示例请求XML
?xml version="1.0" encoding="UTF-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<teiktiTemineAtaskaita xmlns="http://tempuri.org/">
<userName>apps</userName>
<password>mob2015*</password>
<uzduotiesNr>24287</uzduotiesNr>
<inspektavimas xmlns:a="http://schemas.datacontract.org/2004/07/DssisMP" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:apsilankymuObjekteSkaicius i:nil="true" />
<a:atstovai i:nil="true" />
<a:darbdavioBuveinesAdresas i:nil="true" />
<a:darbdavioGimimoData i:nil="true" />
<a:darbdavioKodas>110871120</a:darbdavioKodas>
<a:darbdavioLytis i:nil="true" />
<a:darbdavioPagrindineEkonomineVeikla i:nil="true" />
<a:darbdavioPavadinimas i:nil="true" />
<a:darbdavioPavarde i:nil="true" />
<a:darbdavioTipas i:nil="true" />
<a:darbdavioVardas i:nil="true" />
<a:inspektavimoNr>11112245</a:inspektavimoNr>
<a:inspektavimoPradzia>2015-07-23T00:00:00+03:00</a:inspektavimoPradzia>
<a:inspektavimoTiksloKodas>111</a:inspektavimoTiksloKodas>
<a:institucijos i:nil="true" />
<a:savivaldybesKodas i:nil="true" />
<a:temineAtaskaita>
<a:klausimai>
<a:TAKlausimas>
<a:atsakymas>2</a:atsakymas>
<a:eilNr>1.</a:eilNr>
<a:klausimas i:nil="true" />
<a:kodas>1000</a:kodas>
<a:komentaras i:nil="true" />
</a:TAKlausimas>
<a:TAKlausimas>
<a:atsakymas>1</a:atsakymas>
<a:eilNr>1.1.</a:eilNr>
<a:klausimas i:nil="true" />
<a:kodas>1001</a:kodas>
<a:komentaras i:nil="true" />
</a:TAKlausimas>
<a:TAKlausimas>
<a:atsakymas>3</a:atsakymas>
<a:eilNr>2.</a:eilNr>
<a:klausimas i:nil="true" />
<a:kodas>1002</a:kodas>
<a:komentaras i:nil="true" />
</a:TAKlausimas>
</a:klausimai>
<a:nr>BIOCIDŲ PRIEŽIŪRA-0050-0007</a:nr>
<a:rekomendacijos i:nil="true" />
<a:surasymoData>2015-07-23T00:00:00+03:00</a:surasymoData>
<a:tipas>9</a:tipas>
</a:temineAtaskaita>
<a:tikrintaEkonomineVeikla i:nil="true" />
<a:tikrintaNakti i:nil="true" />
<a:tikrintasObjektas i:nil="true" />
<a:tikrintoObjektoAdresas i:nil="true" />
<a:tikrintoObjektoPavadinimas i:nil="true" />
<a:vadovoAsmensKodas i:nil="true" />
<a:vadovoGimimoData i:nil="true" />
<a:vadovoLytis i:nil="true" />
<a:vadovoPareigos i:nil="true" />
<a:vadovoPavarde i:nil="true" />
<a:vadovoVardas i:nil="true" />
</inspektavimas>
</teiktiTemineAtaskaita>
</s:Body>
</s:Envelope>
我的HTTP传输请求转储XML由KSOAP2生成
<?xml version="1.0" encoding="UTF-8"?>
<v:Envelope xmlns:v="http://schemas.xmlsoap.org/soap/envelope/" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<v:Header />
<v:Body>
<teiktiTemineAtaskaita xmlns="http://tempuri.org/">
<userName>apps</userName>
<password>mob2015*</password>
<uzduotiesNr>212855</uzduotiesNr>
<n0:inspektavimas xmlns:n0="http://tempuri.org/">
<inspektavimoNr i:null="true" />
<n1:inspektavimoPradzia xmlns:n1="http://schemas.datacontract.org/2004/07/DssisMP" i:type="d:dateTime">2015-07-26T21:00:00.000Z</n1:inspektavimoPradzia>
<inspektavimoTiksloKodas>1101</inspektavimoTiksloKodas>
<darbdavioKodas>120163917</darbdavioKodas>
<darbdavioPavadinimas>Statybos ir remonto uždaroji akcinė bendrovė "RISTATYBA"</darbdavioPavadinimas>
<darbdavioTipas>1</darbdavioTipas>
<darbdavioBuveinesAdresas i:null="true" />
<darbdavioPagrindineEkonomineVeikla i:null="true" />
<vadovoAsmensKodas>721788222</vadovoAsmensKodas>
<vadovoVardas>tvt</vadovoVardas>
<vadovoPavarde>gtvt</vadovoPavarde>
<vadovoPareigos>5</vadovoPareigos>
<n2:vadovoGimimoDiena xmlns:n2="http://schemas.datacontract.org/2004/07/DssisMP" i:type="d:dateTime">2015-07-22T21:00:00.000Z</n2:vadovoGimimoDiena>
<vadovoLytis>0</vadovoLytis>
<tikrintasObjektas>3</tikrintasObjektas>
<tikrintoObjektoPavadinimas i:null="true" />
<tikrintoObjektoAdresas i:null="true" />
<savivaldybesKodas>46</savivaldybesKodas>
<tikrintaEkonomineVeikla i:null="true" />
<apsilankymuObjekteSkaicius i:null="true" />
<tikrintaNakti>0</tikrintaNakti>
<n3:temineAtaskaita xmlns:n3="http://schemas.datacontract.org/2004/07/DssisMP">
<n3:nr i:null="true" />
<n3:tipas i:type="d:int">18</n3:tipas>
<n3:surasymoData i:type="d:dateTime">2015-07-22T09:53:59.822Z</n3:surasymoData>
<n3:klausimai>
<n3:TAKlausimas>
<n3:kodas i:type="d:string">3183</n3:kodas>
<n3:eilNr i:type="d:string">1.1.</n3:eilNr>
<n3:klausimas i:null="true" />
<n3:atsakymas i:type="d:int">1</n3:atsakymas>
<n3:komentaras i:null="true" />
</n3:TAKlausimas>
<n3:TAKlausimas>
<n3:kodas i:type="d:string">3184</n3:kodas>
<n3:eilNr i:type="d:string">1.1.1.</n3:eilNr>
<n3:klausimas i:null="true" />
<n3:atsakymas i:type="d:int">2</n3:atsakymas>
<n3:komentaras i:null="true" />
</n3:TAKlausimas>
</n3:klausimai>
<n3:rekomendacijos i:type="d:string">Gyghugyb</n3:rekomendacijos>
</n3:temineAtaskaita>
</n0:inspektavimas>
</teiktiTemineAtaskaita>
</v:Body>
</v:Envelope>
我创建请求的Java代码
List<Questionnaire> questionnaireList = new ArrayList<>();
String METHOD_NAME = "teiktiTemineAtaskaita";
String SOAP_ACTION = "http://tempuri.org/IDssisMP/" + METHOD_NAME;
String A_NAMESPACE = "http://schemas.datacontract.org/2004/07/DssisMP";
String I_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";
String NAMESPACE = "http://tempuri.org/";
String URL = "http://dvs/dssis_ws_test/DssisMP.svc";
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
UserInfo userInfo = UserInfo.getAll().get(0);
request.addProperty("userName", userInfo.getUserName());
request.addProperty("password", userInfo.getPassword());
request.addProperty("uzduotiesNr", taskId);
CompanyInfo ci = CompanyInfo.getByTaskCompanyId(taskId, companyId);
if (ci == null) {
sendResponseFailed(responseHandler);
//starter validation
} else {
//adding all the non-complex properties
SoapObject inspektavimas = new SoapObject(NAMESPACE, "inspektavimas");
if (ci.getInspectationId() != 0) {
inspektavimas.addProperty("inspektavimoNr", ci.getInspectationId());
} else {
inspektavimas.addProperty("inspektavimoNr", null);
}
if (ci.getDateInspectation() != null) {
PropertyInfo p = new PropertyInfo();
p.setNamespace(A_NAMESPACE);
p.setName("inspektavimoPradzia");
p.setType(MarshalDate.class);
p.setValue(ci.getDateInspectation());
inspektavimas.addProperty(p);
} else {
sendResponseFailed(responseHandler);
}
if (ci.getGoalId() != 0) {
inspektavimas.addProperty("inspektavimoTiksloKodas", ci.getGoalId());
} else {
sendResponseFailed(responseHandler);
}
if (ci.getObjectName() != null) {
inspektavimas.addProperty("tikrintoObjektoPavadinimas", ci.getObjectName());
} else { inspektavimas.addProperty("tikrintoObjektoPavadinimas", null);
}
if (ci.getObjectAddress() != null) {
inspektavimas.addProperty("tikrintoObjektoAdresas", ci.getObjectAddress());
} else {
inspektavimas.addProperty("tikrintoObjektoAdresas", null);
}
//...
SoapObject soTemineAtaskaita = new SoapObject(A_NAMESPACE, "temineAtaskaita");
TemineAtaskaita temineAtaskaita = TemineAtaskaita.getByTaskCompanyThemeCode(taskId, companyId, themeCode);
PropertyInfo p = new PropertyInfo();
p.setNamespace(A_NAMESPACE);
p.setName("nr");
if (temineAtaskaita != null && temineAtaskaita.getAtaskaitosNr() != null) {
p.setValue(temineAtaskaita.getAtaskaitosNr());
soTemineAtaskaita.addProperty(p);
} else {
p.setValue(null);
soTemineAtaskaita.addProperty(p);
}
Theme theme = Theme.getByTaskCompanyThemeCode(taskId, companyId, themeCode);
if (theme != null) {
PropertyInfo pType = new PropertyInfo();
pType.setNamespace(A_NAMESPACE);
pType.setName("tipas");
pType.setValue(theme.getThemeCode());
soTemineAtaskaita.addProperty(pType);
PropertyInfo pDate = new PropertyInfo();
pDate.setNamespace(A_NAMESPACE);
pDate.setName("surasymoData");
pDate.setValue(theme.getDate());
pDate.setType(MarshalDate.class);
soTemineAtaskaita.addProperty(pDate);
}
//adding klausimai property which is not seen
SoapObject klausimai = new SoapObject(A_NAMESPACE, "klausimai");
List <Answer> answers = Answer.getByTaskCompanyThemeCode(taskId, companyId, themeCode);
for (Answer answer : answers) {
SoapObject soTAKlausimas = new SoapObject(A_NAMESPACE, "TAKlausimas");
PropertyInfo pCode = new PropertyInfo();
pCode.setNamespace(A_NAMESPACE);
pCode.setName("kodas");
pCode.setValue(answer.getQuestionId());
soTAKlausimas.addProperty(pCode);
Questionnaire questionnaire = Questionnaire.getById(answer.getQuestionId()).get(0);
PropertyInfo pEilNr = new PropertyInfo();
pEilNr.setNamespace(A_NAMESPACE);
pEilNr.setName("eilNr");
pEilNr.setValue(questionnaire.getPosition());
soTAKlausimas.addProperty(pEilNr);
PropertyInfo pKlausimas = new PropertyInfo();
pKlausimas.setNamespace(A_NAMESPACE);
pKlausimas.setName("klausimas");
pKlausimas.setValue(null);
soTAKlausimas.addProperty(pKlausimas);
PropertyInfo pAnswer = new PropertyInfo();
pAnswer.setNamespace(A_NAMESPACE);
pAnswer.setName("atsakymas");
pAnswer.setValue(questionnaire.getPosition());
if (answer.getAnswer() == QuestionItem.STATUS.YES.ordinal())
pAnswer.setValue(1);
else if (answer.getAnswer() == QuestionItem.STATUS.NO.ordinal())
pAnswer.setValue(2);
else if (answer.getAnswer() == QuestionItem.STATUS.UNKNOWN.ordinal())
pAnswer.setValue(3);
else if (answer.getAnswer() == QuestionItem.STATUS.PLAIN.ordinal())
pAnswer.setValue(null);
soTAKlausimas.addProperty(pAnswer);
PropertyInfo pComment = new PropertyInfo();
pComment.setNamespace(A_NAMESPACE);
pComment.setName("komentaras");
if (answer.getComment() != null && !answer.getComment().replace(" ", "").replace(" ", "").isEmpty()) {
pComment.setValue(answer.getComment());
} else {
pComment.setValue(null);
}
soTAKlausimas.addProperty(pComment);
klausimai.addSoapObject(soTAKlausimas);
}
soTemineAtaskaita.addSoapObject(klausimai);
if (theme != null) {
PropertyInfo pSuggestions = new PropertyInfo();
pSuggestions.setNamespace(A_NAMESPACE);
pSuggestions.setName("rekomendacijos");
if (theme.getSuggestions() != null && !theme.getSuggestions().replace(" ", "").replace(" ", "").isEmpty()) {
pSuggestions.setValue(theme.getSuggestions());
} else {
pSuggestions.setValue(null);
}
soTemineAtaskaita.addProperty(pSuggestions);
}
inspektavimas.addSoapObject(soTemineAtaskaita);
request.addSoapObject(inspektavimas);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setAddAdornments(false);
envelope.implicitTypes = true;
envelope.setOutputSoapObject(request);
new MarshalDate().register(envelope);
HttpTransportSE androidHttpTransport = new HttpTransportSE(URL, 45 * 1000);
androidHttpTransport.debug = true;
androidHttpTransport.call(SOAP_ACTION, envelope);
final SoapObject response = (SoapObject) envelope.getResponse();
****//...****
}
答案 0 :(得分:0)
事实证明,我设法与服务器公司合作,问题是在<{1}}标记内订购。 temineAtaskaita
属性应该是第一个给出的属性,而在klausimai
标记之外,排序并不重要,这是令人困惑的。
现在出现的其他问题是,inspektavimas
内的所有内容都是inspektavimas
,因为属性没有命名空间。将它们添加为PropertyInfo会在XML请求转储中提供大量重复的命名空间(n0,n1,...,n20),并且服务器无法处理它。但这是另一个问题。