android - Android中如何解析SOAP?

标签 android android-ksoap2

我是这个 SOAP Web 服务的新手。这是我的 ksoap lib 依赖项,

 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();
    }
}

最佳答案

    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

关于android - Android中如何解析SOAP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44540776/

相关文章:

java - 如何使用字符串值以编程方式将图像设置到适配器内的 ImageView?

android - 自动调整 TextView 大小以在 Canvas 上绘制

java - Android 在 AsyncTask onPostExecute 中使用 Interface 返回值

java - ksoap2 org.xmlpull.v1.xmlpullparserexception 预期 start_tag 错误

android - Ksoap for android 无法创建良好的 soapEnvelop

android - Dagger Hilt 没有在测试中注入(inject)

android - 网站上的链接可以使用 token 登录应用程序或回退到网站

java - Dagger 2、如何添加依赖接口(interface)

android - KSOAP: "org.ksoap2.serialization.SoapPrimitive"异常问题

android - Android 模拟器无法访问 Soap Web 服务?