我正在开发一个与第三方集成的 SOAP 应用程序。我觉得这个第三方的WSDL很奇怪。我对 SOAP 还很陌生,所以如果它没有损坏,我不想要求他们修复它。以下是我注意到的一些我认为错误的事情,尽管我确信它在技术上是有效的文档(因此我在标题中写了“最佳实践”)。另外,我使用 gSOAP 作为我的 SOAP 库,这可能就是为什么我认为其中一些事情很奇怪(我对 gSOAP 的了解甚至比对一般 SOAP 的了解还要新)。
它们在同一 WSDL 中具有为 SOAP 1.1 和 SOAP 1.2 指定的接口。这导致 gSOAP 生成所需数量的两倍,因为我只使用 1.2。
他们所有的命名空间都是http://tempuri.org. 不应该是这样的,对吧?
尽管定义了一堆 RPC 调用,但它们的 WSDL 使用文档格式。我正在考虑要求他们切换到 RPC 格式,因为 gSOAP 似乎不会生成采用 C++ 类型参数作为文档格式的方法。相反,它为每个 API 函数的输入和响应数据创建一个新类。如果我无法解决这个问题,我将不得不编写另一层包裹 gSOAP 的内容,以便为我的应用程序的其余部分提供合理的 API。另外,AFAICT,如果他们切换到 RPC,那么来回的 XML 将与现在完全相同,所以我认为这不会很困难。
元素的 minOccurs = 0 但当我提交没有它们的请求时,我会收到返回的错误,表明它们是必需的(有时甚至是空指针异常的堆栈跟踪)。如果需要的话,他们应该将它们指定为 minOccurs = 1,对吧?
几乎所有 Web 服务函数都指定一个响应,其中包含一个表示成功的整数(实际上是一个布尔值)和一个错误消息字符串。他们应该为此使用 SOAP 错误吗?我认为如果这是一个错误,我的应用程序会更容易处理,因为 gSOAP 可以让我很容易地弄清楚这一点(并简单地打印错误消息)。
当然,我并不对这家第 3 方公司仅仅因为我要求他们改变他们的 WSDL 就抱有很高的希望。至少我会学到一些东西……据我所知,这些都没有错,甚至没有问题。感谢您的帮助。
我正在使用gsoap 2.8连接到WCF服务(我的应用程序是客户端)。
它是线程安全的吗?我应该定义一些预编译的定义吗?
谢谢,
马丹
我想在Windows上为项目实现Web服务客户端.我想获得网络服务信息,肥皂请求和肥皂响应.我需要一个可以用于这些目的的C++库(而不是wsdlpull).
要求:
更具体一点:库应该有这样的简单调用来获取Web服务信息
invoker.getOperations(operations);
outputXml += "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
outputXml += "<webService";
outputXml += " name=\"" + GetServiceName(&invoker) + "\"";
outputXml += ">\n";
outputXml += "\t<webMethods>\n";
Run Code Online (Sandbox Code Playgroud)
谢谢.
我正在使用同一应用程序中的2个单独的wsdl文件在linux上使用gSOAP编写C++ Web服务客户端.我已经设法只使用一个wsdl文件,在阅读文档后,在两个文件上都使用了wsdl2h:
wsdl2h -o header.h wsdlfile1.wsdl wsdlfile2.wsdl
Run Code Online (Sandbox Code Playgroud)
这很好,所以我做了
soapcpp2 -i -I/usr/share/gsoap/import/ header.h
Run Code Online (Sandbox Code Playgroud)
然后我按照指示在typemap.dat中完成了所有常用的命名空间修改.我现在发现我有两个类型为soapService1Proxy.cpp/h和soapService2Proxy.cpp/h的.cpp和.h文件.这不是我所期望的,但无论如何,我在我的main函数中包含了两个头文件并创建了每个Proxy类的实例,并且使用的方式与我只使用一个wsdl文件完全相同.然后我编译
g++ -DWITH_OPENSSL main.cpp soapC.cpp soapService1Proxy.cpp soapService2Proxy.cpp -lgsoapssl++ -lssl
Run Code Online (Sandbox Code Playgroud)
它返回错误
/tmp/ccHNDAM4.o:(.data+0x0): multiple definition of `namespaces'
/tmp/ccLJIHwV.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我知道'namepaces'是指.nsmap文件中的数组(在这种情况下,每个wsdl都是相同的).我只包含其中一个,因为如果我包含两者,编译器会抱怨多个定义.我真的很感激,如果有人能告诉我我在这里做错了什么,因为我尽可能忠实地遵循指南和gSOAP文档,但根本无法解决这个问题.
我的项目即将引入 SOAP。它将用于 C++ <-> Java 和 C++ <-> Flex 通信。我负责重构我们的应用程序以利用 Java 业务规则引擎和新的 Flex gui。
C++ SOAP 必须阅读哪些资源?我读过W3材料。我们可能在 Solaris 机器上使用 gSOAP。
我按照gSoap页面上的步骤尝试使用Mingw32 Compiler在Qt/Windows中运行示例代码.但是,我无法将lgsoap ++添加到链接器,如文档中所述,因为它不在源包中
要完成构建,请使用您的代码编译和链接生成的soapC.cpp,soapcalcProxy.cpp和运行时gSOAP引擎-lgsoap ++(或使用源stdsoap2.cpp,以防libgsoap ++ .a未安装).
然后我尝试将stdsoap2.cpp添加到SOURCES,结果这是编译输出.所以我的问题是我将如何使用Mingw32编译器在Qt中运行此示例代码片段,或者我将如何生成该lgsoap ++.以下是我的专业和源文件:
QT -= gui
TARGET = SoapCalc
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp \
../Console/gsoap/stdsoap2.cpp
OTHER_FILES += ../../../../../gsoap/gsoap-2.7/gsoap/calc.nsmap
HEADERS += ../../../../../gsoap/gsoap-2.7/gsoap/soapcalcProxy.h
#include"C:/gsoap/gsoap-2.7/gsoap/soapcalcProxy.h"
#include"C:/gsoap/gsoap-2.7/gsoap/calc.nsmap"
int main(int argc, char *argv[])
{
calcProxy service;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我对在Ubuntu中部署Web服务有疑问.它是使用gSOAP实现的,应该进行部署,例如可以从网站(例如ASP .NET开发)访问.
我对整个CGI,Ubuntu,Apache主题感到困惑.到目前为止,我能够在ASP .NET中实现Web服务并将其部署在Microsoft ISS上.除此之外,我还可以使用ASP .NET访问WSDL中描述的gSOAP Web服务
部署我自己的Web服务有哪些步骤?我有一些更具体的问题:
- 我是否必须将WS编译为CGI?
- 我是否必须在Ubuntu中安装Apache或者该服务已经启用?
- 在哪个特定目录中,我必须将生成的代码放在WS编译中(我猜是"CGI")?
关于gSOAP和整个"Web服务世界",我是一个新手,特别是在Ubuntu ......
非常感谢你提前!
我gSOAP用于Web服务,但我有一个问题我必须将2个Web服务编译成一个可执行文件,并且一些函数具有相同的名称而不是使用函数名称的其他前缀的参数.
编译错误:
X.o: In function `soap_get_string(soap*, char**, char const*, char const*)':
X.cpp:8669: multiple definition of `soap_get_string(soap*, char**, char const*, char const*)'
Y.o:Y.cpp:4763: first defined here
Run Code Online (Sandbox Code Playgroud)
在Makefile中:
wsdl2h -qlpr X.wsdl
wsdl2h Y.wsdl Y.xsd
soapcpp2 -qlpr -plpr -plprws $(GSOAP_IMPORT) -i -C X.h
soapcpp2 -psiwcprws $(GSOAP_IMPORT) -i -C Y.h
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?
我正在寻找一种方法来检测gsoap Web服务是否可用.不幸的是,当服务离线时,客户端gsoap会长时间调用阻塞.将soap.recv_timeout和soap.send_timeout设置为零无济于事.
我知道有很多关于SOAP,膨胀,XML和REST等替代机制的讨论.
这是情况.一个新的团队成员真正在谈论SOAP,这是基于手工实现协议的难度.他推荐使用gSOAP(项目全部是用C++编写的.)他说明了像WSDL这样的东西清理了大量乱码的手工编写的C++.
现在我正在使用基于XML的文本消息和expat XML库来处理大多数网络.所以我有一些编程工作(不多)与消息格式的修改或参数列表的添加相关联.在发送方端,我打包XML请求并通过普通的旧TCP套接字发送它.在接收器处,我使用DOM或SAX解析XML.等等到目前为止它工作得很好.XML消息非常紧凑,平均最多只有几百个字符.我理解这些消息中的每个项目.
我们希望使用PHP编码的网站可以访问产品的一部分(服务器).这部分推动了这一想法,对于脚本编写者来说,SOAP接口将"更容易".这个项目的每个人都认为SOAP就是他们的救赎.
我看到像gSOAP这样的新大型图书馆的推出对成熟项目的势头具有高度破坏性.
我想知道的是,如果有一种不同的,更紧凑的方式来做SOAP给我们的东西.如何平衡gSOAP或其他SOAP工具的要求,使开发生活更容易对抗硬实际.
IE,我被告知WSDL比使用XML库手动编码C++更好,更容易,更像工作.它将C++对象的语义直接放入网络消息的声明中.问题是,我定义的许多XML消息都没有将一对一映射到接收端的单个不同对象.
或者,我可能无所事事.
但是我在这里扫描信息的现实似乎与我在当地被告知的内容相矛盾.