• vc6控制台程序利用SoapToolkit3.0调用WebService


    vc6控制台程序利用SoapToolkit3.0调用WebService

    1. 首先要安装SoapToolkit3.0安装包并安装(我的安装目录为:D:\Program Files\MSSOAP\)

    2. 新建vc控制台程序(空项目),项目名称:WinConsole6InvokeWebService,添加一个c++源文件(main.cpp),将SOAP安装目录下的lib文件D:\Program Files\MSSOAP\Lib\mssoap30.lib复制到项目文件夹下。

    3。添加源代码:

    #include <stdio.h>
    #include <iostream>
    #include <vector>
    
    #import "msxml4.dll"
    
    using namespace std;
    using namespace MSXML2;
    
    #import "C:\Program Files\Common Files\MSSoap\Binaries\MSSOAP30.dll" \
    		exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
    		"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
    
    using namespace MSSOAPLib30;
    
    void query(char* EndPointURL, char* Namespace, char* method, vector<string>& v)
    {
    	ISoapSerializerPtr Serializer;
    	ISoapReaderPtr Reader;
    	ISoapConnectorPtr Connector;
    	
    	// Connect to the service
    	Connector.CreateInstance(__uuidof(HttpConnector30));
    	Connector->Property["EndPointURL"] = EndPointURL;		// 接口位置
    	Connector->Connect();									// 和服务器连接
    	
    	// Begin message
    	Connector->Property["SoapAction"] = _bstr_t(Namespace) + _bstr_t(method);
    	Connector->BeginMessage();
    
    	Serializer.CreateInstance(__uuidof(SoapSerializer30));
    
    	// 将serializer连接到connector的输入字符串
    	Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
    
    	// 创建SOAP消息
    	Serializer->StartEnvelope("soap", "", "");
    	Serializer->StartBody("body");
    	Serializer->StartElement(method, Namespace, "", "");	// 命名空间必须有
    
    	for(vector<string>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		Serializer->StartElement("username", Namespace, "", "");
    		Serializer->WriteString(it->c_str());
    		Serializer->EndElement();
    	}
    
    	Serializer->EndElement();
    
    	Serializer->EndBody();
    	Serializer->EndEnvelope();
    
    	Connector->EndMessage();				// Send the message to the web service
    
    	// 读取响应
    	Reader.CreateInstance(__uuidof(SoapReader30));
    	Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
    
    	printf("Answer: %s\n", (const char*)Reader->RpcResult->text);	// Reader->RpcResult->Gettext()等效
    }
    
    int main(int argc, char* argv[])
    {
    	CoInitialize(NULL);
    	char* EndPointURL = "http://192.168.0.100/WebService1/Service.asmx";
    	char* Namespace = "http://tempuri.org/";
    
    	vector<string> v1, v2;
    
    	v2.push_back("JoeBlack");
     	query(EndPointURL, Namespace, "Hello", v2);
    
    	CoUninitialize();
    	getchar();
    
    	return 0;
    }
    

    这样,程序就完成了,运行起来就可以得到WebService的服务了。

    其中的WebService服务是用ASP.NET2005(C#)开发的,源码如下:

    using System;
    using System.Web;
    using System.Web.Services;
    using System.Web.Services.Protocols;
    
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Service : System.Web.Services.WebService
    {
        public Service () {
    
            //如果使用设计的组件,请取消注释以下行 
            //InitializeComponent(); 
        }
    
        [WebMethod(Description = "Let's say \"Hi\"")]
        public string Hi()
        {
            return "Hello World, Happy New Year!";
        }
    
        [WebMethod(Description = "Hello JoeBlack")]
        public string Hello(string username)
        {
            return username + ", Happy New Year!";
        }
    
        [WebMethod(Description = "求和的方法")]
        public double addition(double i, double j)
        {
            return i + j;
        }
    
        [WebMethod(Description = "求差的方法")]
        public double subtract(double i, double j)
        {
            return i - j;
        }
    
        [WebMethod(Description = "求积的方法")]
        public double multiply(double i, double j)
        {
            return i * j;
        }
    
        [WebMethod(Description = "求商的方法")]
        public double division(double i, double j)
        {
            if (j != 0)
                return i / j;
            else
                return 0;
        }
    }
    

    调用的Hello方法,其调用方式如下:

    SOAP 1.1

    以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

    POST /WebService1/Service.asmx HTTP/1.1
    Host: localhost
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    SOAPAction: "http://tempuri.org/Hello"
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <Hello xmlns="http://tempuri.org/">
          <username>string</username>
        </Hello>
      </soap:Body>
    </soap:Envelope>
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Body>
        <HelloResponse xmlns="http://tempuri.org/">
          <HelloResult>string</HelloResult>
        </HelloResponse>
      </soap:Body>
    </soap:Envelope>

    SOAP 1.2

    以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。

    POST /WebService1/Service.asmx HTTP/1.1
    Host: localhost
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <Hello xmlns="http://tempuri.org/">
          <username>string</username>
        </Hello>
      </soap12:Body>
    </soap12:Envelope>
    HTTP/1.1 200 OK
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <HelloResponse xmlns="http://tempuri.org/">
          <HelloResult>string</HelloResult>
        </HelloResponse>
      </soap12:Body>
    </soap12:Envelope>

    HTTP POST

    以下是 HTTP POST 请求和响应示例。所显示的占位符需替换为实际值。

    POST /WebService1/Service.asmx/Hello HTTP/1.1
    Host: localhost
    Content-Type: application/x-www-form-urlencoded
    Content-Length: length
    
    username=string
    HTTP/1.1 200 OK
    Content-Type: text/xml; charset=utf-8
    Content-Length: length
    
    <?xml version="1.0" encoding="utf-8"?>
    <string xmlns="http://tempuri.org/">string</string>
  • 相关阅读:
    bk.
    仅仅为了记录
    一个简单的Lua解释器
    Lua与C++相互调用
    Struts标签、Ognl表达式、el表达式、jstl标签库这四者之间的关系和各自作用
    OGNL表达式struts2标签“%,#,$”
    Java异常报错机制
    到底EJB是什么?
    Spring总结
    JSON(JavaScript Object Notation)
  • 原文地址:https://www.cnblogs.com/joeblackzqq/p/1961818.html
Copyright © 2020-2023  润新知