专栏首页10km的专栏gsoap入门:gsoap的plugin机制说明塈使用plugin实现调试soap函数时显示

gsoap入门:gsoap的plugin机制说明塈使用plugin实现调试soap函数时显示

版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net/10km/article/details/52188473

昨天调用gsoap函数时出错了,通过输出错误信息,知道了是服务器端的错误(参见前一篇博客《gsoap入门:获取gsoap的错误信息》)。 但仍然是一头雾水,不知道服务器端为什么报错,还需要更详细的信息,所以想到了能不能获取ressponse xml。 于是满世界找如何能获取gsop发送和接收的xml文本的办法,在google上找到了线索:gsoap的插件(plugin)机制: gsoap 的插件是对gsoap进行功能扩展的一种便利机制,类似callback回调函数(或者类似java或c++的接口)。通过对soap对象添加用户自定义的插件,可以让插件中的callbacks函数重载soap原来的函数,让callbacks函数获取对gsoap的完全访问。在向soap对象注册了指定插件后,用户自定义的callbacks函数就接管了gosp中的核心调用(比如fsend,frecv),在此基础上用户可以对gsoap的进行功能扩展。 下面是注册和搜索插件的函数:

int soap_register_plugin_arg(struct soap *soap, int (*fcreate)(struct soap *soap, struct soap_plugin *p, void *arg), void *arg) void* soap_lookup_plugin(struct soap*, const char*);

关于plugin机制更的官方说明参见《gSOAP Plug-ins》

gsoap的plugin文件夹下提供了不少成熟的插件代码,这些可以直接拿来使用,关于这些插件的说明也请参见《gSOAP Plug-ins》

显示requese/response xml

这些插件中的一个基本的例子:plugin.c,plugin.h,就实现了显示requese/response xml的功能。 首先将plugin.c,plugin.h两个文件复制到自己项目代码路径下,并将plugin.c加入项目代码。

然后在用到plugin.c中函数的代码文件中加入#include "plugin.h"

并在soap_init之后加入下面的代码,将plugin注册到soap对象中。

soap_register_plugin(&soap, plugin);

test_gsoap.cp代码示例:

#include <sstream>
#include "FaceDbServiceSoap11Binding.nsmap"
#include "file_utilits.h"
#include "stdlib.h"
#include "plugin.h"
using namespace facedbservice;
int main(int argc, char * argv[]) {
    struct soap soap;
    soap_init(&soap);
    // 注册plugin插件显示request/response xml文本
    soap_register_plugin(&soap, plugin);
    _ns1__sdk_USCOREdetectFace param;
    _ns1__sdk_USCOREdetectFaceResponse ret;
    auto img_file= gdface::load_binary_file("d:\\tmp\\he049.jpg");
    xsd__base64Binary b;
    b.soap = &soap;
    b.__ptr = img_file.data();
    b.__size = img_file.size();
    param.imgData = &b;
    // soap调用
    soap_call___ns1__sdk_USCOREdetectFace(&soap,"http://gdface.wicp.net:15865/axis2/services/FaceDbService.FaceDbServiceHttpSoap12Endpoint/",nullptr, &param,ret);
    if (soap.error!= SOAP_OK) {
        soap_stream_fault(&soap, std::cerr);
    }else {
        for (auto code : ret.return_) {
            std::printf("soap err,errcode = (%d,%d,%d,%d)\n", *(code->pos->left), *(code->pos->top), *(code->pos->width), *(code->pos->height));
        }
    }
}

这样在调用soap函数的时候,就会自动显示request/response的xml文本。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 透过源码学习设计模式3—BeanFactory、FactoryBean和工厂模式

    简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类,简单工厂是“固定的”,因为只有一个实现,没有子类。它不属于23种设计模式之一,但在...

    java达人
  • 如何使用 jq 接收 blob 数据

    目前 jq 用的人还是挺多的,在一些简单的促销 h5 页面,用 jq 去实现一些简单的功能还是比较方便的。本文展示如何用 JQ 去请求一个 blob 对象的 i...

    JS菌
  • Python爬虫网页,解析工具lxml.html(二)

    【前情回顾】如何灵活的解析网页,提取我们想要的数据,是我们写爬虫时非常关心和需要解决的问题。

    一墨编程学习
  • Python 爬虫网页内容提取工具xpath

    上一节,我们详述了lxml.html的各种操作,接下来我们熟练掌握一下XPath,就可以熟练的提取网页内容了。

    一墨编程学习
  • 『互联网架构』软件架构-掌握dubbo常规应用(下)(41)

    PS:学习dubbo最好的方式,就是观看api,肯定有老铁说dubbo有注释的方式,为啥还停留到xml,太low了吧,非也,你要暴露服务,用xml是不是更容易管...

    IT故事会
  • 『互联网架构』软件架构-掌握dubbo常规应用(上)(40)

    1.Provider(提供者)绑定指定端口并启动服务(20880)。2.提供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储。3.C...

    IT故事会
  • 一个安卓样本的逆向分析过程

    该 APK 样本是通过国外的下载站进行投放的,伪装成正常的软件并在特定情况下启动后门模块获取用户信息,VT 报读情况如下

    信安之路
  • Python 爬虫网页,解析工具lxml.html(一)

    狭义上讲,爬虫只负责抓取,也就是下载网页。而实际上,爬虫还要负责从下载的网页中提取我们想要的数据,即对非结构化的数据(网页)进行解析提取出结构化的数据(有用数据...

    一墨编程学习
  • Java中的注解是如何工作的?

    自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分。开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecate...

    哲洛不闹
  • ROS文件系统(工程结构)

    介绍catkin的编译系统,catkin工作空间的创建和结构,package软件包的创建和结构,介绍CMakeLists.txt文件,package.xml以及...

    小飞侠xp

扫码关注云+社区

领取腾讯云代金券