如何在Android中进行SOAP解析?

问题描述:

是新来这个SOAP的Web服务。这是我的KSOAP LIB扶养,如何在Android中进行SOAP解析?

repositories { 
    maven { url 'https://oss.sonatype.org/content/repositories/ksoap2-android-releases/' } 
} 
dependencies { 
    compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.1' 
} 

请看看我的SOAP请求和响应

POST /loyaltywebservice/LoyaltyWebService.asmx HTTP/1.1 
Host: host url is here 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://tempuri.org/AttemptLogin" 

<?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> 
    <UserCredential xmlns="http://tempuri.org/"> 
     <userName>string</userName> 
     <password>string</password> 
    </UserCredential> 
    </soap:Header> 
    <soap:Body> 
    <AttemptLogin xmlns="http://tempuri.org/"> 
     <LoyalCustCode>string</LoyalCustCode> 
     <PwdStr>string</PwdStr> 
    </AttemptLogin> 
    </soap:Body> 
</soap:Envelope> 

虽然上午解析正在逐渐网络服务身份验证失败。但是这是在“POSTMAN”中工作的。下面的代码我已经尝试过了,并且我刚更改的用户名和密码,因为我无法打开证书。所以我只是添加了1234.看看我的代码。并请帮助我在哪里做错了。

public void soapLogin() { 
    try { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 

        //Prepare the header with the authentication data. 
        Element headers = new Element().createElement(UrlActivity.NAMESPACE, "UserCredential"); 

        Element username = new Element().createElement(UrlActivity.NAMESPACE, "userName"); 
        username.addChild(Node.TEXT, "test"); 
        headers.addChild(Node.ELEMENT, username); 

        Element pass = new Element().createElement(UrlActivity.NAMESPACE, "password"); 
        pass.addChild(Node.TEXT, "1234"); 
        headers.addChild(Node.ELEMENT, pass); 

        // Soap Request 
        final SoapObject request = new SoapObject(UrlActivity.NAMESPACE, UrlActivity.METHOD_NAME); 
        request.addProperty("LoyalCustCode","12345"); 
        request.addProperty("PwdStr","12345"); 

        final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        // add header to envelope 
        envelope.headerOut = new Element[1]; 
        envelope.headerOut[0] = headers; 
        envelope.setOutputSoapObject(request); 

        //Add the header to the envelope. 
        final HttpTransportSE androidHttpTransport = new HttpTransportSE(UrlActivity.URL); 
        androidHttpTransport.debug = true; 
        androidHttpTransport.call(UrlActivity.SOAP_ACTION, envelope); 
        Log.d("Login", "Request:- "+androidHttpTransport.requestDump); 

        final SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 
        Log.d("Login", "Response:- "+androidHttpTransport.responseDump); 
        // final SoapObject result = (SoapObject) envelope.getResponse(); 
        String response = result.toString(); 
        Log.d("Login", "Response:- "+response); 
       }catch (Exception ex){ 
        Log.e("Login", "soapLogin:- "+ex.getMessage()); 
       } 
      } 
     }).start(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

什么样的错误?您分享错误日志 – Ninja

+0

soapcliente我/ resultado ::函数尝试登录错误:-2147467261 –

+0

请发布您日志,因为在一行lo g不容易确切知道问题出在哪里(Androin或PHP)? – Ninja

final SoapObject request = new SoapObject(UrlActivity.NAMESPACE, UrlActivity.METHOD_NAME); 
         // TODO the two params are child soap objects not properties 
         SoapObject loyal = new SoapObject(UrlActivity.NAMESPACE, "LoyalCustCode"); 
         loyal.setInnerText("1234"); 
         request.addSoapObject(loyal); 

         loyal = new SoapObject(UrlActivity.NAMESPACE, "PwdStr"); 
         loyal.setInnerText("1234"); 
         request.addSoapObject(loyal); 
//Params are different than child node 
+0

伟大的工作...工作过... –

首先,你需要在你的build.gradle添加这些

repositories { 
    maven { url 'https://oss.sonatype.org/content/repositories/ksoap2-android-releases/' } 
} 
dependencies { 
    compile 'com.google.code.ksoap2-android:ksoap2-android:3.6.1' 
} 

然后使用下面的代码获取API响应 -

  SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      SoapObject loyal = new SoapObject(NAMESPACE, "LoyalCustCode"); 
      loyal.setInnerText("custcode"); 
      request.addSoapObject(loyal); 

      loyal = new SoapObject(NAMESPACE, "PwdStr"); 
      loyal.setInnerText("pass"); 
      request.addSoapObject(loyal); 

      Element headers = new Element().createElement(NAMESPACE, "UserCredential"); 

      Element username = new Element().createElement(NAMESPACE, "userName"); 
      username.addChild(Node.TEXT, "test"); 
      headers.addChild(Node.ELEMENT, username); 

      Element pass = new Element().createElement(NAMESPACE, "password"); 
      pass.addChild(Node.TEXT, "1234"); 
      headers.addChild(Node.ELEMENT, pass); 

      SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
      envelope.headerOut = new Element[1]; 
      envelope.headerOut[0] = headers; 
      envelope.setOutputSoapObject(request); 

      HttpTransportSE ht = new HttpTransportSE(URL); 
      try { 
       ht.call(SOAP_ACTION, envelope); 
       SoapPrimitive response = (SoapPrimitive) envelope.getResponse(); 
       resultado = response.toString(); 
       Log.i("Resultado: ", resultado); 
      } catch (Exception e) { 
       Log.i("Error: ", e.getMessage()); 
       e.printStackTrace(); 
       return false; 
      }