如何使SOAP请求 [英] How to make the SOAP request

查看:309
本文介绍了如何使SOAP请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在做Android的SOAP请求。究竟我想实现的是:

 <肥皂:信封的xmlns:SOAP =htt​​p://www.w3.org/2003/05/soap-envelope的xmlns:TEM =HTTP:// tempuri .ORG />
   <肥皂:页眉/>
   <肥皂:身体与GT;
      &LT; TEM:GeneratePin&GT;         &LT; TEM:sEmail&GT; xyz@abc.com< / TEM:sEmail&GT;         &LT; TEM:sFlage&GT;真&LT; / TEM:sFlage&GT;
      &LT; / TEM:GeneratePin&GT;
   &LT; / SOAP:身体与GT;
&LT; / SOAP:信封&GT;

但我正在逐渐:

 &LT;五:信封的xmlns:I =htt​​p://www.w3.org/2001/XMLSchema-instance的xmlns:D =HTTP://www.w3 .ORG / 2001 / XML模式的xmlns:C =http://www.w3.org/2003/05/soap-encoding的xmlns:v =后面http://www.w3.org/2003/05/soap -envelope&GT;
&LT;五:页眉/&GT;
&LT;五:身体与GT;
&LT; TEM:GeneratePin的xmlns =htt​​p://www.tempuri.org/&GT;
&LT; TEM:sEmail&GT; abc@xyz.com< / TEM:sEmail&GT;
&LT; TEM:sFlage&GT;真&LT; / TEM:sFlage&GT;
&LT; / TEM:GeneratePin&GT;
&LT; / V:车身&GT;
&LT; / V:信封&GT;

我用下面的code:

 静态字符串SOAP_ACTION =htt​​p://tempuri.org/GeneratePin;
    静态字符串命名空间=htt​​p://www.tempuri.org/;
    私有静态字符串URL =XYZ;    静态SoapObject请求= NULL;
    静态SoapSerializationEnvelope信封;
    静态HttpTransportSE androidHttpTransport;    //方法名变量定义Web服务哪些函数将调用
    公共静态字符串getPin(字符串方法名){        尝试{
            请求=新SoapObject(命名空间,TEM:GeneratePin);            / *
             * PI的PropertyInfo =新的PropertyInfo(); pi.setName(sEmail);
             * pi.setValue(rishabh@vervesys.local); request.addProperty(PI);
             *
             *的PropertyInfo PI1 =新的PropertyInfo(); pi1.setName(sFlage);
             * pi1.setValue(真); request.addProperty(PI1);
             * /            request.addProperty(TEM:sEmail,abc@xyz.com);
            request.addProperty(TEM:sFlage,真);            的System.out.println(要求是:==+请求);
            信封=新SoapSerializationEnvelope(SoapEnvelope.VER12);
            envelope.dotNet = TRUE;
            envelope.implicitTypes = TRUE;
            envelope.setAddAdornments(假);
            envelope.encodingStyle =UTF-8;
            envelope.setOutputSoapObject(请求);
            / *
             * MarshalDouble marshaldDouble =新MarshalDouble();
             * marshaldDouble.register(信封);
             * /            androidHttpTransport =新HttpTransportSE(URL);
            androidHttpTransport.debug = TRUE;            androidHttpTransport.call(SOAP_ACTION,信封);
            System.out的
                    .println(!ONE @#$%^&安培;+ androidHttpTransport.requestDump);
            / *
             * androidHttpTransport
             * .setXmlVersionTag(&下; XML版本= \\1.0 \\编码= \\UTF-8 \\&GT;);
             * /
            最后SoapPrimitive响应=(SoapPrimitive)信封
                    .getResponse();
            Log.i(web服务输出,response.toString());
            返回response.toString();        }赶上(例外五){
            e.printStackTrace();
        }
        返回null;
    }


解决方案

它看起来像KSOAP有一个硬codeD的命名空间的SoapEnvelope 值:

<一个href=\"https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java#L182\" rel=\"nofollow\">https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java#L182

  / **
*写完整的包膜,包括标题和正文元素到
*给定的XML作家。
* /
    公共无效写入(XmlSerializer的作家)抛出IOException
        writer.set preFIX(I,XSI);
        writer.set preFIX(D,XSD);
        writer.set preFIX(C,ENC);
        writer.set preFIX(V,ENV);
        writer.startTag(ENV,信封);
        writer.startTag(ENV,页眉);
        writeHeader(作家);
        writer.endTag(ENV,页眉);
        writer.startTag(ENV,身体);
        writeBody(作家);
        writer.endTag(ENV,身体);
        writer.endTag(ENV,信封);
    }

SoapSerializationEnvelope 你在这里创造:

 信封=新SoapSerializationEnvelope(SoapEnvelope.VER12);

...是的SoapEnvelope 的子类。所以,去改变,你需要继承 SoapSerializationEnvelope 像这样:

 公共类CustomSoapSerializationEnvelope扩展SoapSerializationEnvelope {    @覆盖
    公共无效写入(XmlSerializer的作家)抛出IOException
        writer.set preFIX(I,XSI);
        writer.set preFIX(D,XSD);
        writer.set preFIX(C,ENC);
        writer.set preFIX(肥皂,ENV); //&LT; - 改线
        writer.startTag(ENV,信封);
        writer.startTag(ENV,页眉);
        writeHeader(作家);
        writer.endTag(ENV,页眉);
        writer.startTag(ENV,身体);
        writeBody(作家);
        writer.endTag(ENV,身体);
        writer.endTag(ENV,信封);
    }
}

然后,替换上述行:

 信封=新CustomSoapSerializationEnvelope(SoapEnvelope.VER12);

I am making a SOAP request in Android. What exactly I want to achieve is:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/">
   <soap:Header/>
   <soap:Body>
      <tem:GeneratePin>

         <tem:sEmail>xyz@abc.com</tem:sEmail>

         <tem:sFlage>true</tem:sFlage>
      </tem:GeneratePin>
   </soap:Body>
</soap:Envelope>

but I am getting:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope">
<v:Header />
<v:Body>
<tem:GeneratePin xmlns="http://www.tempuri.org/">
<tem:sEmail>abc@xyz.com</tem:sEmail>
<tem:sFlage>true</tem:sFlage>
</tem:GeneratePin>
</v:Body>
</v:Envelope>

I am using the following code:

static String SOAP_ACTION = "http://tempuri.org/GeneratePin";
    static String namespace = "http://www.tempuri.org/";
    private static String url = "xyz";

    static SoapObject request = null;
    static SoapSerializationEnvelope envelope;
    static HttpTransportSE androidHttpTransport;

    // MethodName variable is define for which webservice function will call
    public static String getPin(String MethodName) {

        try {
            request = new SoapObject(namespace, "tem:GeneratePin");

            /*
             * PropertyInfo pi = new PropertyInfo(); pi.setName("sEmail");
             * pi.setValue("rishabh@vervesys.local"); request.addProperty(pi);
             * 
             * PropertyInfo pi1 = new PropertyInfo(); pi1.setName("sFlage");
             * pi1.setValue("true"); request.addProperty(pi1);
             */

            request.addProperty("tem:sEmail", "abc@xyz.com");
            request.addProperty("tem:sFlage", "true");

            System.out.println("request is : == " + request);
            envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12);
            envelope.dotNet = true;
            envelope.implicitTypes = true;
            envelope.setAddAdornments(false);
            envelope.encodingStyle = "utf-8";
            envelope.setOutputSoapObject(request);
            /*
             * MarshalDouble marshaldDouble = new MarshalDouble();
             * marshaldDouble.register(envelope);
             */

            androidHttpTransport = new HttpTransportSE(url);
            androidHttpTransport.debug = true;

            androidHttpTransport.call(SOAP_ACTION, envelope);
            System.out
                    .println("ONE!@#$%^& " + androidHttpTransport.requestDump);
            /*
             * androidHttpTransport
             * .setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
             */
            final SoapPrimitive response = (SoapPrimitive) envelope
                    .getResponse();
            Log.i("Webservice Output", response.toString());
            return response.toString();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

解决方案

It looks like KSoap has a hardcoded value for the namespace in SoapEnvelope:

https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java#L182

/**
* Writes the complete envelope including header and body elements to the
* given XML writer.
*/
    public void write(XmlSerializer writer) throws IOException {
        writer.setPrefix("i", xsi);
        writer.setPrefix("d", xsd);
        writer.setPrefix("c", enc);
        writer.setPrefix("v", env);
        writer.startTag(env, "Envelope");
        writer.startTag(env, "Header");
        writeHeader(writer);
        writer.endTag(env, "Header");
        writer.startTag(env, "Body");
        writeBody(writer);
        writer.endTag(env, "Body");
        writer.endTag(env, "Envelope");
    }

The SoapSerializationEnvelope you're creating here:

envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 

…is a subclass of SoapEnvelope. So, to change the behaviour, you need to subclass SoapSerializationEnvelope like so:

public class CustomSoapSerializationEnvelope extends SoapSerializationEnvelope {

    @Override
    public void write(XmlSerializer writer) throws IOException {
        writer.setPrefix("i", xsi);
        writer.setPrefix("d", xsd);
        writer.setPrefix("c", enc);
        writer.setPrefix("soap", env); // <-- changed line
        writer.startTag(env, "Envelope");
        writer.startTag(env, "Header");
        writeHeader(writer);
        writer.endTag(env, "Header");
        writer.startTag(env, "Body");
        writeBody(writer);
        writer.endTag(env, "Body");
        writer.endTag(env, "Envelope");
    }
}

Then, replace the above line with:

envelope = new CustomSoapSerializationEnvelope(SoapEnvelope.VER12); 

这篇关于如何使SOAP请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆