代码之家  ›  专栏  ›  技术社区  ›  Roger Far

ksoap2 android无效SOAP

  •  5
  • Roger Far  · 技术社区  · 14 年前

    我正在尝试将Android和ksoap2结合在一起发布到我自己的测试SOAP服务器(C)。

    现在我有了SOAP服务器的规范,它期望:

    POST /SharingpointCheckBarcode.asmx HTTP/1.1
    Host: awc.test.trin-it.nl
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/checkBarcode"
    
    <?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:Header>
        <AuthHeader xmlns="http://tempuri.org/">
          <username>string</username>
          <password>string</password>
        </AuthHeader>
      </soap:Header>
      <soap:Body>
        <checkBarcode xmlns="http://tempuri.org/">
          <barcode>string</barcode>
        </checkBarcode>
      </soap:Body>
    </soap:Envelope>  
    

    但Android ksoap2发出的信息是:

    <?xml version="1.0" encoding="utf-8"?>
        <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>
                <checkBarcode xmlns="http://tempuri.org" id="o0" c:root="1">
                    <username i:type="d:string">test</username>
                    <password i:type="d:string">test</password>
                    <barcode i:type="d:string">2620813000301</barcode>
                </checkBarcode>
            </v:Body>
        </v:Envelope>
    

    使用此代码:

        try {
        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    
            request.addProperty("username", "test");
            request.addProperty("password", "test");
            request.addProperty("barcode", "2620813000301");
    
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.encodingStyle = "test";
    
            envelope.setOutputSoapObject(request);
    
            AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport (URL); 
            androidHttpTransport.debug = true;
            androidHttpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
    
            androidHttpTransport.call(SOAP_ACTION, envelope);
            Log.d("MyAPP", "----------------- " + androidHttpTransport.requestDump +"\r\n\r\n" + androidHttpTransport.responseDump);
            ((TextView)findViewById(R.id.lblStatus)).setText(androidHttpTransport.requestDump +"\r\n\r\n" + androidHttpTransport.responseDump);
        } catch(Exception E) {
            ((TextView)findViewById(R.id.lblStatus)).setText("ERROR:" + E.getClass().getName() + ": " + E.getMessage());
        }
    

    我从服务器上得到的响应是没有找到任何结果,所以不是一个错误,但是当我用另一个应用程序或PHP测试它时,它使用相同的数据,它说没问题。

    我想是因为

    1 回复  |  直到 8 年前
        1
  •  5
  •   Manfred Moser    14 年前

    当您使用addproperty时,它会自动将其添加到SOAP主体中,这样在您的示例中就错了。

    如果要设置用户名/密码安全头,必须建立必要的元素[],并将其设置为信封上的HeaderOut。

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.headerOut = security;
    

    要将安全性作为元素建立起来,您可以使用以下行中的某些内容

            Element usernameElement = new Element().createElement(OASIS_SECURITY_XSD_URL, "Username");
            usernameElement.addChild(Node.TEXT, username);
            Element passwordElement = new Element().createElement(OASIS_SECURITY_XSD_URL, "Password");
            passwordElement.addChild(Node.TEXT, password);
    
            Element usernameTokenElement = new Element().createElement(OASIS_SECURITY_XSD_URL, "UsernameToken");
            usernameTokenElement.addChild(Node.ELEMENT, usernameElement);
            usernameTokenElement.addChild(Node.ELEMENT, passwordElement);
    
            Element securityElement = new Element().createElement(OASIS_SECURITY_XSD_URL, "Security");
            securityElement.setPrefix(null, OASIS_SECURITY_XSD_URL);
            securityElement.addChild(Node.ELEMENT, usernameTokenElement);
    

    在将其设置为headerout之前,将其全部添加到元素[]中