本文引用:
1.使用Visual C++开发SOAP客户端应用
2.http://www.cnblogs.com/babyblue/archive/2004/04/02/5030.aspx
3.关于 Unicode 和字符集的最基础的知识
4.ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样
不同的WebService需要更改的地方:
1.请求的URL:
Connector->Property["EndPointURL"] = "http://localhost/Test/Test.asmx";
2.请求的SoapAction(访问C#写的http://localhost/Test/Test.asmx时它会告诉你SoapAction是什么)
Connector->Property["SoapAction"] = "http://tempuri.org/HelloWorld";
3.所请求的方法名及其所需要的参数
Serializer->StartElement("HelloWorld","http://tempuri.org","","");
Serializer->EndElement();
注意红色的地方一定要写得一模一样,否则该方法的参数传进去时会变成NULL
总结一下必要的关键步骤(使用SOAP ToolKit3.0)
1.导入类型库
2.需要创建一个SoapConnector
3.下一步创建SoapSerializer
4.下一步把消息附加到SoapConnector的输入流
5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
6.SoapReader被连接到SoapConnector输出流
7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复
英文原文
http://www.codeguru.com/Cpp/COM-Tech/complus/soap/article.php/c3945/
如何发送中文?
发送中文的话还需要进行编码转换,在机器中通常是DBCS双字节字符集,要将它转成Unicode,然后再转成UTF-8才能发送。同理,接收时收到的是UTF-8,要将其还原成Unicode,再变成DBCS。
关于中文字符的编码可以参考:关于 Unicode 和字符集的最基础的知识
简单地说,
DBCS:采用GBK/GB2312编码,有代码页(GB2312是936),英文字符一个字节,代码页中的字符两个字节。
UTF-16(UCS2):用两个字节表示一个中文字或一个英文字,所有的东西都是两个字节的。
UTF-32(UCS4):同上,只不过用4个固定的字节表示一个中文字或英文字。
UTF-8:用1-6个字节表示一个Unicode编码,比较复杂:开始有几个1就表示该Unicode编码由几个字节组成,如:10……表示由1个字节组成;110……由两个字节组成。后续的每个字节都是10xx xxxx。
UTF-7:另一种Unicode编码,我暂时未用过。
char str[5] = "中文";
int iLenWideChar = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), NULL, 0);
strWideChar = new unsigned short[iLenWideChar];
if(NULL == strWideChar)
{
goto Exit;
}
int iLenRet = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), strWideChar, iLenWideChar);
返回时:
char * iterator = strReturn;
//convert UTF-8 to WideChar
for(unsigned int i=0; iterator <= (strReturn+iLenReturn) && i<iLenReturn; ++i)
{
sp_UTF8_UCS(iterator,UTF8Return[i]);
}
//UTF-8 to UTF16
int iLenANSIReturn = WideCharToMultiByte(0, 0, UTF8Return, -1, NULL, 0, NULL, NULL);
strANSIReturn = new char[iLenANSIReturn];
if(NULL == strANSIReturn)
{
goto Exit;
}
WideCharToMultiByte(0, 0, UTF8Return, -1, strANSIReturn, iLenANSIReturn, NULL, NULL);
printf("ANSI:%s\n", strANSIReturn);
getchar();
最后不要忘了delete
Exit:
if(NULL != strWideChar)
{
delete [] strWideChar;
strWideChar = NULL;
}
if(NULL != strANSIReturn)
{
delete [] strANSIReturn;
strANSIReturn = NULL;
}
1.使用Visual C++开发SOAP客户端应用
2.http://www.cnblogs.com/babyblue/archive/2004/04/02/5030.aspx
3.关于 Unicode 和字符集的最基础的知识
4.ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样
不同的WebService需要更改的地方:
1.请求的URL:
Connector->Property["EndPointURL"] = "http://localhost/Test/Test.asmx";
2.请求的SoapAction(访问C#写的http://localhost/Test/Test.asmx时它会告诉你SoapAction是什么)
Connector->Property["SoapAction"] = "http://tempuri.org/HelloWorld";
3.所请求的方法名及其所需要的参数
Serializer->StartElement("HelloWorld","http://tempuri.org","","");
Serializer->EndElement();
注意红色的地方一定要写得一模一样,否则该方法的参数传进去时会变成NULL
总结一下必要的关键步骤(使用SOAP ToolKit3.0)
1.导入类型库
2.需要创建一个SoapConnector
3.下一步创建SoapSerializer
4.下一步把消息附加到SoapConnector的输入流
5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
6.SoapReader被连接到SoapConnector输出流
7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复
英文原文
http://www.codeguru.com/Cpp/COM-Tech/complus/soap/article.php/c3945/
如何发送中文?
发送中文的话还需要进行编码转换,在机器中通常是DBCS双字节字符集,要将它转成Unicode,然后再转成UTF-8才能发送。同理,接收时收到的是UTF-8,要将其还原成Unicode,再变成DBCS。
关于中文字符的编码可以参考:关于 Unicode 和字符集的最基础的知识
简单地说,
DBCS:采用GBK/GB2312编码,有代码页(GB2312是936),英文字符一个字节,代码页中的字符两个字节。
UTF-16(UCS2):用两个字节表示一个中文字或一个英文字,所有的东西都是两个字节的。
UTF-32(UCS4):同上,只不过用4个固定的字节表示一个中文字或英文字。
UTF-8:用1-6个字节表示一个Unicode编码,比较复杂:开始有几个1就表示该Unicode编码由几个字节组成,如:10……表示由1个字节组成;110……由两个字节组成。后续的每个字节都是10xx xxxx。
UTF-7:另一种Unicode编码,我暂时未用过。
char str[5] = "中文";
int iLenWideChar = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), NULL, 0);
strWideChar = new unsigned short[iLenWideChar];
if(NULL == strWideChar)
{
goto Exit;
}
int iLenRet = MultiByteToWideChar(0, 0, const_cast<char *>(str), sizeof(str), strWideChar, iLenWideChar);
返回时:
char * iterator = strReturn;
//convert UTF-8 to WideChar
for(unsigned int i=0; iterator <= (strReturn+iLenReturn) && i<iLenReturn; ++i)
{
sp_UTF8_UCS(iterator,UTF8Return[i]);
}
//UTF-8 to UTF16
int iLenANSIReturn = WideCharToMultiByte(0, 0, UTF8Return, -1, NULL, 0, NULL, NULL);
strANSIReturn = new char[iLenANSIReturn];
if(NULL == strANSIReturn)
{
goto Exit;
}
WideCharToMultiByte(0, 0, UTF8Return, -1, strANSIReturn, iLenANSIReturn, NULL, NULL);
printf("ANSI:%s\n", strANSIReturn);
getchar();
最后不要忘了delete
Exit:
if(NULL != strWideChar)
{
delete [] strWideChar;
strWideChar = NULL;
}
if(NULL != strANSIReturn)
{
delete [] strANSIReturn;
strANSIReturn = NULL;
}