java - KSOAP2请求体格式问题

标签 java android xml wsdl ksoap2

我在 SAP ECC 6.0 中激活了一项服务,我能够成功地从 SOAP UI 5 进行测试,它生成以下 SOAP REQUEST

SOAPUI 5.0 生成的请求成功运行

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:glob="http://sap.com/xi/SAPGlobal20/Global">
   <soapenv:Header/>
   <soapenv:Body>
      <glob:PurchaseOrderItemByAccountAssignmentQuery_sync>
         <PurchaseOrderItemSelectionByAccountAssignment>
            <PurchaseOrderItemAccountAssignmentCostCentreID schemeID="?" schemeAgencyID="?">15001030000600</PurchaseOrderItemAccountAssignmentCostCentreID>
         </PurchaseOrderItemSelectionByAccountAssignment>
      </glob:PurchaseOrderItemByAccountAssignmentQuery_sync>
   </soapenv:Body>
</soapenv:Envelope>

但是,当我使用以下代码从 KSOAP2 API 调用此服务时,我无法获得正确的响应,而是收到元素丢失错误。

代码(基于android)生成错误请求

private static final String NAMESPACE = "http://sap.com/xi/SAPGlobal20/Global";
private static String URL = "http://sapqas.trkl.com:8000/sap/bc/srt/xip/sap/ecc_purchaseorder003qr/330/abcdef/abcdef_binding";
private static final String METHOD_NAME = "PurchaseOrderItemByAccountAssignmentQuery_sync";
private static final String SOAP_ACTION = "";

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
PropertyInfo propInfo = new PropertyInfo();

propInfo.setName("PurchaseOrderItemAccountAssignmentCostCentreID");
propInfo.setType(String.class);
propInfo.setValue("15001030000600");
request.addProperty(propInfo);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

envelope.implicitTypes = true;
envelope.setOutputSoapObject(request);

androidHttpTransport.debug = true;

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
List <HeaderProperty> headerPropertyList = new ArrayList<HeaderProperty>();
headerPropertyList.add(new HeaderProperty("Authorization", "Basic bsadasdWxpsadasdZmNAsadaNA=="));

envelope.encodingStyle = SoapSerializationEnvelope.ENC;

try {

androidHttpTransport.call(SOAP_ACTION, envelope,headerPropertyList);
SoapObject response = (SoapObject) envelope.getResponse();

            } catch (SoapFault e) {

                Toast.makeText(MainlayoutActivity.this,
                        e.faultcode + " Error : 0" + e.getMessage(), Toast.LENGTH_LONG)
                        .show();

                e.printStackTrace();

            } catch (HttpResponseException e) {
                // TODO Auto-generated catch block
                Toast.makeText(MainlayoutActivity.this,
                        e.getStatusCode() + " Error : 1" + e.getMessage(),
                        Toast.LENGTH_LONG).show();
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Toast.makeText(MainlayoutActivity.this,
                        "Error : 2" + e.getMessage(), Toast.LENGTH_LONG).show();
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                // TODO Auto-generated catch block
                Toast.makeText(MainlayoutActivity.this,
                        e.getLineNumber() + "Error : 3" + e.getMessage(),
                        Toast.LENGTH_LONG).show();
                e.printStackTrace();
            }

            catch (Exception e) {
                Toast.makeText(MainlayoutActivity.this,
                        "Error : 4" + e.toString(), Toast.LENGTH_LONG).show();

            }

我的代码生成的肥皂请求如下,其中缺少一个元素,但我不确定如何使用 KSOAP2 API 将其添加到我的请求中。

由上述代码创建的请求

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header />
<v:Body>
<n0:PurchaseOrderItemByAccountAssignmentQuery_sync id="o0" c:root="1" xmlns:n0="http://sap.com/xi/SAPGlobal20/Global">
<PurchaseOrderItemAccountAssignmentCostCentreID>15001030000600</PurchaseOrderItemAccountAssignmentCostCentreID>
</n0:PurchaseOrderItemByAccountAssignmentQuery_sync>
</v:Body>
</v:Envelope>

Error from Web Service: (CX_ST_GROUP_MISSING_CASE)

必填

我想将第一个请求中的标签添加到我的肥皂请求中,但无法这样做。

其他信息:

在“PurchaseOrderItemSelectionByAccountAssignment”标签下方可能有多个参数,但我仅使用“PurchaseOrderItemAccountAssignmentCostCentreID”参数。

有人知道我哪里出了问题以及如何更改它以创建正确的肥皂请求吗?

问候,

最佳答案

我的问题已使用 kvmserialization 接口(interface)实现得到解决,如下面的链接所述。

这本质上是一个实现复杂类型的例子。

经验教训:如果您在创建/解析肥皂请求或响应时遇到问题,请将您的 WSDL 及其内容与 KSOAP API 进行映射,在进行一些研究后,您将找到答案。

Nesting properties inside a tag in Ksoap2

关于java - KSOAP2请求体格式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23926065/

相关文章:

java - 如何每 500 - 1000 毫秒刷新一次 div 标签?

java - Java中的静态类

java - 在 spring boot 应用程序中外部化查询

javascript - 无法使用 Blob 对象在客户端打开 `docx` 文件 - vanilla JavaScript

java - 通过单独的类在复合设计模式上实现迭代器 - 它在编程上是否有效?

java - 将 Kotlin mockito 测试代码复制到 Java

android - 获取实际的 View 高度

android - Camera2 API 与外部 USB 摄像头

java - 使用 GPS (LocationManager) 如何获取当前时间?

xml - 如何使属性在 xml 模式中唯一?