如何发出 SOAP 请求

2024-03-14

我正在 Android 中发出 SOAP 请求。我到底想要实现的是:

<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>[email protected] /cdn-cgi/l/email-protection</tem:sEmail>

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

但我得到:

<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>[email protected] /cdn-cgi/l/email-protection</tem:sEmail>
<tem:sFlage>true</tem:sFlage>
</tem:GeneratePin>
</v:Body>
</v:Envelope>

我正在使用以下代码:

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("[email protected] /cdn-cgi/l/email-protection"); request.addProperty(pi);
             * 
             * PropertyInfo pi1 = new PropertyInfo(); pi1.setName("sFlage");
             * pi1.setValue("true"); request.addProperty(pi1);
             */

            request.addProperty("tem:sEmail", "[email protected] /cdn-cgi/l/email-protection");
            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;
    }

看起来 KSoap 对命名空间有一个硬编码值SoapEnvelope:

https://github.com/karlmdavis/ksoap2-android/blob/master/ksoap2-base/src/main/java/org/ksoap2/SoapEnvelope.java#L182 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你在这里创建:

envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 

…是一个子类SoapEnvelope。因此,要改变行为,您需要子类化SoapSerializationEnvelope像这样:

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

然后,将上面的行替换为:

envelope = new CustomSoapSerializationEnvelope(SoapEnvelope.VER12); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何发出 SOAP 请求 的相关文章

随机推荐

  • 在本地计算机上使用 Github 操作秘密 - 可能吗?

    我知道我可以使用curl 来通过curl 列出存储库的秘密 如下所示 curl H Accept application vnd github v3 json H Authorization token personal access to
  • Python 寻找素因数

    两部分问题 试图确定 600851475143 的最大质因数 我在网上发现了这个程序似乎有效 问题是 尽管我了解该程序正在做什么的基础知识 但我很难弄清楚它到底是如何工作的 另外 我希望您能阐明您可能知道的寻找素因数的任何方法 也许无需测试
  • Visual Studio 2010 的 HWnd

    有没有办法从 VSIX 扩展获取指向 Visual Studio 2010 顶部窗口的 HWnd 指针 我想更改窗口的标题 由于您的 VSIX 扩展很可能会与 Visual Studio 一起在进程内运行 因此您应该尝试以下操作 Syste
  • fork:关闭所有打开的套接字

    我在用multiprocessing Pool map 它分叉当前进程 我的理解是 默认情况下 所有文件描述符包括插座分叉时从主进程复制 主进程本身是一个Web服务器 使用cherrypy http cherrypy org 所以这会对开放
  • 需要在 bootstrap css 中单击时将图像加载为模态

    我尝试通过淡入淡出背景来加载模态图像 这个对我有用 但是对于多个图像 如何在不编写多个模态 div 的情况下根据图像 id 加载我单击的图像
  • VB 2010 中的对象是否获得了与 C# 4.0 中的动态相同的优化?

    有些人认为 C 4 0 引入的功能dynamic关键字与VB的 一切都是对象 特性相同 但是 对动态变量的任何调用都将被转换为委托一次 从那时起 将调用该委托 在VB中 当使用Object 不应用缓存 并且对非类型化方法的每次调用都涉及大量
  • 使用 helm 在 kubernetes 集群中运行 Nexus

    有一个 Nexus 的舵图 https github com helm charts tree master stable sonatype nexus https github com helm charts tree master st
  • 关于Future.firstCompletedOf和Garbage Collect机制

    I ve encountered this problem in my real life project and proved by my testing code and profiler Instead of pasting tl d
  • 如何创建一个流,其中的项目基于该流之前返回的项目?

    我有一个函数可以生成futures Stream基于一个论点 我想多次调用这个函数并将流压平在一起 使问题变得复杂的是 我想将流返回的值作为参数提供给原始函数 具体来说 我有一个函数可以将数字流返回到零 fn numbers down to
  • 具有精确 OR 值的嵌套 IF 语句

    我是 Excel IF 语句的新手 并且在我认为所谓的 IF 语句方面遇到了麻烦嵌套 IF 函数 我在这里查看了其他 IF 问题 它们对于我的新手大脑来说太复杂了 无法理解 我有一列 里面有数字 大约有十几个不同的数字 这些数字代表一个特定
  • 对重复内容不显示是否会影响 SEO/语义?

    重复内容上的 Display none 是否会影响 SEO 语义 假设您正在构建一个移动优先的响应式网站 在较小的断点处 您选择显示页面的标题标语 h1 在主要英雄横幅中 但是 稍后您希望在同一位置显示公司徽标 并在子横幅中显示您的口号 例
  • 如何获取使用 Angular $http 下载的文件的名称?

    我编写了使用 Angular http 下载文件的代码 文件的名称是notURL 中指定 URL 包含文件的唯一标识符 该标识符是从应用程序外部获取的 When http get myUrl 被调用 一切正常 文件已被检索 我可以在回调处理
  • Java 中动态转换为泛型类型

    这是我整理的一个简单的例子 private static
  • 使用 WPF 视觉层的高性能图形

    我正在创建一个 WPF 映射程序 该程序可能会同时加载数百个文件并将其绘制到屏幕上 并且用户可能想要缩放和平移此显示 其中一些文件类型可能包含数千个点 这些点很可能作为某种路径连接 其他支持的格式包括 TIFF 文件 使用一个绘制所有数据的
  • Stripe API - 收据列表

    我正在使用 Stripe API 我想向客户展示他们的发票历史记录列表以及相关收据 我在 Stripe API 中找不到任何地方 https stripe com docs api lang php https stripe com doc
  • PHP 会话很难跨分布式系统扩展吗?

    在工作中 我们几乎用 Java 和 Perl 完成所有工作 但我想使用 PHP 和会话构建一个功能 有些人认为尝试在我们的系统上进行 PHP 会话是一个坏主意 因为它分布到许多服务器 具体问题会是什么 您还可以使用自定义会话保存处理程序 h
  • 如何在条件查询中使用MAP的键?

    我有一个这样的豆子 Class TestA Map
  • 构建 python 模块并将其链接到 MacOSX 框架

    我正在尝试在 MacOSX 10 6 上构建 Python 扩展并将其链接到多个框架 仅限 i386 我使用 distutils 和 Extension 对象创建了一个 setup py 文件 我为了链接我的框架 我的LDFLAGS环境变量
  • Imshow 和 imwrite 在 matlab 中显示空白图像

    我正在尝试将图像存储在数组中以进行一些分析 当我循环该过程并将结果 imwrite 到各种文件中时 它会存储一个空白图像 与 imshow 相同 当我在控制台上打印图像数组时 这些值是它们应该的值 从 50 到 200 不等 这是我的代码出
  • 如何发出 SOAP 请求

    我正在 Android 中发出 SOAP 请求 我到底想要实现的是