delphi或BCB6下如何调用SOAP服务

时间:2022-12-04 17:38:01
现在要实现一个手机发短信的功能。
1.在IIS下的soap服务已经安装完毕,
通过访问http://localhost:801/SMSService.exe/wsdl页面也可以正常显示。
2.ShortMessege\server下的ScktSrvr.exe和SMS.exe 都可以起来。
3.现在我在delphi下该怎么去调用soap服务??
在网上找到的一些资料http://www.web521.com/web/586568/T667436.shtml是delphi和DB2环境下的,但是有很多地方都看不太懂,按照它上面的步骤操作出来的结果也不一样。

请问我该怎么去做?

9 个解决方案

#1


file->new->webservices->swdl importer

#2


可以再说的详细一点么?

#3


么有遇到过~ 顶起

#4


我现在添加wsdl importer进入到工程里,
它生成一个ISMSService.cpp的一个文件
内容是这样的:
#include <vcl.h>
#pragma hdrstop

#if !defined(ISMSServiceH)
#include "ISMSService.h"
#endif

namespace NS_ISMSService {

_di_ISMSService GetISMSService(bool useWSDL, AnsiString addr)
{
  static const char* defWSDL= "http://192.168.10.108:801/SMSService.exe/wsdl/ISMSService";
  static const char* defURL = "http://192.168.10.108:801/SMSService.exe/soap/ISMSService";
  static const char* defSvc = "ISMSServiceservice";
  static const char* defPrt = "ISMSServicePort";
  if (addr=="")
    addr = useWSDL ? defWSDL : defURL;
  THTTPRIO* rio = new THTTPRIO(0);
  if (useWSDL) {
    rio->WSDLLocation = addr;
    rio->Service = defSvc;
    rio->Port = defPrt;
  } else {
    rio->URL = addr;
  }
  _di_ISMSService service;
  rio->QueryInterface(service);
  if (!service)
    delete rio;
  return service;
}


// ************************************************************************ //
// This routine registers the interfaces and types used by invoke the SOAP
// Service.
// ************************************************************************ //
static void RegTypes()
{
  /* ISMSService */
  InvRegistry()->RegisterInterface(__interfaceTypeinfo(ISMSService), L"urn:SMSServiceIntf-ISMSService", L"utf-8");
  InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(ISMSService), L"urn:SMSServiceIntf-ISMSService#%operationName%");
}
#pragma startup RegTypes 32

};     // NS_ISMSService


但是我现在该怎么去调用它?请高手指教.在线等。

#5


我的代码,你参照以下,还是建议你到网上找找说明
        _di_IwsGetMSN service;
String result="";
String email,password;

email = Edit1->Text;
password = Edit2->Text;

service=GetIwsGetMSN(true,"http://192.168.1.92:8000/getMSNLst/getMSNLst.dll/wsdl/IwsGetMSN");

result = service->GetMSN(email,password);

Memo1->Lines->Add(result);

#6


_di_ISMSService pSMS = GetISMSService(true,NULL);
if(pSMS)
{
    pSMS->...;//你的SOAP提供的功能,参考h文件里ISMSService的定义
}

#7


感谢楼上的回复!还有点疑问。
这是ISMSService.h中的ISMSService的定义
__interface INTERFACE_UUID("{2133FC9C-6894-95FA-ABF6-D69EB4A08A4B}") ISMSService : public IInvokable
{
public:
  virtual AnsiString      GetMessage() = 0; 
  virtual int             SetMsg(const AnsiString Msg, const AnsiString Tel, const AnsiString SendTime) = 0; 
  virtual int             DelMsg(const AnsiString MsgID) = 0; 
  virtual int             ModfiyMsg(const AnsiString MsgID, const AnsiString Msg, const AnsiString Tel, const AnsiString SendTime) = 0; 
  virtual void            GetMsg(AnsiString& xmldata) = 0; 
};
typedef DelphiInterface<ISMSService> _di_ISMSService;

_di_ISMSService GetISMSService(bool useWSDL=false, AnsiString addr="");


我是这样调用的:
_di_ISMSService smsService;
String result = "";
OleCheck(HTTPRIO1->QueryInterface(smsService));
//smsService = GetISMSService(true,"http://192.168.10.108:801/SMSService.exe/wsdl/ISMSService");
if(smsService)
{
    result = smsService->SetMsg(smsContent,mobile,sendTime);//这3个参数都已经在上面定义
}
//在这里可以看到result的值为1。
smsService->GetMsg(result);
//我这样写对么?但是这个方法的返回值是void 
但是接下来我该怎么将发送的数据写入数据以库。

#8


这个是SOAP服务提供的范围了,你看看ISMSService的技术说明书或找他们客服吧:)

#9


~~呵呵 问题已经解决了!谢谢大家了。

#1


file->new->webservices->swdl importer

#2


可以再说的详细一点么?

#3


么有遇到过~ 顶起

#4


我现在添加wsdl importer进入到工程里,
它生成一个ISMSService.cpp的一个文件
内容是这样的:
#include <vcl.h>
#pragma hdrstop

#if !defined(ISMSServiceH)
#include "ISMSService.h"
#endif

namespace NS_ISMSService {

_di_ISMSService GetISMSService(bool useWSDL, AnsiString addr)
{
  static const char* defWSDL= "http://192.168.10.108:801/SMSService.exe/wsdl/ISMSService";
  static const char* defURL = "http://192.168.10.108:801/SMSService.exe/soap/ISMSService";
  static const char* defSvc = "ISMSServiceservice";
  static const char* defPrt = "ISMSServicePort";
  if (addr=="")
    addr = useWSDL ? defWSDL : defURL;
  THTTPRIO* rio = new THTTPRIO(0);
  if (useWSDL) {
    rio->WSDLLocation = addr;
    rio->Service = defSvc;
    rio->Port = defPrt;
  } else {
    rio->URL = addr;
  }
  _di_ISMSService service;
  rio->QueryInterface(service);
  if (!service)
    delete rio;
  return service;
}


// ************************************************************************ //
// This routine registers the interfaces and types used by invoke the SOAP
// Service.
// ************************************************************************ //
static void RegTypes()
{
  /* ISMSService */
  InvRegistry()->RegisterInterface(__interfaceTypeinfo(ISMSService), L"urn:SMSServiceIntf-ISMSService", L"utf-8");
  InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(ISMSService), L"urn:SMSServiceIntf-ISMSService#%operationName%");
}
#pragma startup RegTypes 32

};     // NS_ISMSService


但是我现在该怎么去调用它?请高手指教.在线等。

#5


我的代码,你参照以下,还是建议你到网上找找说明
        _di_IwsGetMSN service;
String result="";
String email,password;

email = Edit1->Text;
password = Edit2->Text;

service=GetIwsGetMSN(true,"http://192.168.1.92:8000/getMSNLst/getMSNLst.dll/wsdl/IwsGetMSN");

result = service->GetMSN(email,password);

Memo1->Lines->Add(result);

#6


_di_ISMSService pSMS = GetISMSService(true,NULL);
if(pSMS)
{
    pSMS->...;//你的SOAP提供的功能,参考h文件里ISMSService的定义
}

#7


感谢楼上的回复!还有点疑问。
这是ISMSService.h中的ISMSService的定义
__interface INTERFACE_UUID("{2133FC9C-6894-95FA-ABF6-D69EB4A08A4B}") ISMSService : public IInvokable
{
public:
  virtual AnsiString      GetMessage() = 0; 
  virtual int             SetMsg(const AnsiString Msg, const AnsiString Tel, const AnsiString SendTime) = 0; 
  virtual int             DelMsg(const AnsiString MsgID) = 0; 
  virtual int             ModfiyMsg(const AnsiString MsgID, const AnsiString Msg, const AnsiString Tel, const AnsiString SendTime) = 0; 
  virtual void            GetMsg(AnsiString& xmldata) = 0; 
};
typedef DelphiInterface<ISMSService> _di_ISMSService;

_di_ISMSService GetISMSService(bool useWSDL=false, AnsiString addr="");


我是这样调用的:
_di_ISMSService smsService;
String result = "";
OleCheck(HTTPRIO1->QueryInterface(smsService));
//smsService = GetISMSService(true,"http://192.168.10.108:801/SMSService.exe/wsdl/ISMSService");
if(smsService)
{
    result = smsService->SetMsg(smsContent,mobile,sendTime);//这3个参数都已经在上面定义
}
//在这里可以看到result的值为1。
smsService->GetMsg(result);
//我这样写对么?但是这个方法的返回值是void 
但是接下来我该怎么将发送的数据写入数据以库。

#8


这个是SOAP服务提供的范围了,你看看ISMSService的技术说明书或找他们客服吧:)

#9


~~呵呵 问题已经解决了!谢谢大家了。