BCB程序调用WebService接口

winteryang26 2011-10-17 10:18:06
用BCB自带的WebService类写了一个调用WebService接口的功能,但调用的时候出现not acceptable(406)
先把基本的代码贴出来,重建一个小工程就可以重现上述错误,请各位帮忙看下哪里有问题(WebService地址:http://59.42.10.53:8088/PDAService/RoomPerInfo.asmx)

WebService类的头文件的代码
#ifndef Service1H
#define Service1H

#include <System.hpp>
#include <InvokeRegistry.hpp>
#include <XSBuiltIns.hpp>
#include <SoapHTTPClient.hpp>

namespace NS_Service1 {
__interface INTERFACE_UUID("{CFE467D4-A39E-2BD2-5836-7685A9E27F8D}") Service1Soap : public IInvokable
{
public:
virtual AnsiString HelloWorld() = 0;
virtual AnsiString SetRoomPerInfo(const AnsiString StationName,const AnsiString name,const AnsiString company,const AnsiString dept,const AnsiString mobile,const AnsiString intertime,const int eventtype) = 0;
};
typedef DelphiInterface<Service1Soap> _di_Service1Soap;

_di_Service1Soap GetService1Soap(bool useWSDL=false, AnsiString addr="", AnsiString URL="");
};

WebService类的cpp文件代码:

#include <vcl.h>
#pragma hdrstop
#if !defined(Service1H)
#include "Service1.h"
#endif

namespace NS_Service1 {
_di_Service1Soap GetService1Soap(bool useWSDL, AnsiString addr, AnsiString URL) //by weiyl 2011-08-18 useWSDL=true,调用本机webservice, =false 调用非本机的地址
{ //URL 通过配置文件传递进来
static const char* defWSDL= "F://winter project//BCB WebService Client//Service1.wsdl";
static const char* defURL = "http://192.168.36.22/WYL/TEST/Service1.asmx"; //对方提供的地址
static const char* defSvc = "Service1";
static const char* defPrt = "Service1Soap";
if (addr=="")
//addr = useWSDL ? defWSDL : defURL; //访问非本机时,注释掉此句
addr = URL; //访问非本机,用此句 以上定义的地址都没有用到
THTTPRIO* rio = new THTTPRIO(0);
rio->HTTPWebNode->UseUTF8InHeader = true;
rio->Converter->Options<<soUTF8InHeader;
if (useWSDL) {
rio->WSDLLocation = addr;
rio->Service = defSvc;
rio->Port = defPrt;
} else {
rio->URL = addr;
}
_di_Service1Soap service;
rio->QueryInterface(service);
if (!service)
delete rio;
return service;
}

static void RegTypes()
{
/* Service1Soap */
InvRegistry()->RegisterInterface(__interfaceTypeinfo(Service1Soap), L"http://dzxj.szmcc.net/", L"utf-8");
InvRegistry()->RegisterDefaultSOAPAction(__interfaceTypeinfo(Service1Soap), L"http://dzxj.szmcc.net/%operationName%");
InvRegistry()->RegisterInvokeOptions(__interfaceTypeinfo(Service1Soap), ioDocument);
}
#pragma startup RegTypes 32

};

主函数里面的调用代码:
NS_Service1::_di_Service1Soap p = NS_Service1::GetService1Soap(false, "", ss); //进入WebService类
AnsiString temptime = AnsiString("2011-08-18 20:00:00"); //进入时间
AnsiString stationname = "棠下一村"; //基站名称
AnsiString name = "水岭" ;
AnsiString company = "XXX" ;
AnsiString dept = "软件工程师" ;
AnsiString mobile = "13570420000" ;
p->SetRoomPerInfo(stationname,name,company,dept,mobile,temptime,1);

...全文
576 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
luominghai87314 2012-03-14
  • 打赏
  • 举报
回复
如果服务端要验证信息(如用户名、密码),客服端怎样加呢?
zzbinfo 2011-10-18
  • 打赏
  • 举报
回复
bcb 向导生成的那个类本来就是两个参数的.象这样
_di_ServiceSoap GetServiceSoap(bool useWSDL=false, AnsiString addr="");
winteryang26 2011-10-17
  • 打赏
  • 举报
回复
问题已经解决,在于GetService1Soap()这个函数,BCB自动生成的时候自带2个参数,我把他加了一个参数,就出错了。其实这里加这个参数也完全没有道理,该回去就OK了。至于为什么这个函数只能带2个参数,就不知道怎么回事了

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧