• 直接代码POST数据调用WebService


    ps:使用过webservice的童鞋大概都明白它是基于Soap协议交换数据的,同时Soap协议是对HTTP协议的扩展,其实我们就可以认为调用一个WEB服务就是通过http协议GET或POST数据的过程,只不过中间的输入/输出数据是遵守Soap协议格式的标准XML。明白这个道理之后我们就可以通过构造请求数据来模拟调用WEB服务的过程了,具体代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Net;
    using System.IO;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Encoding encoding = Encoding.UTF8;
                string responseData = String.Empty;            
    
                WebRequest request = HttpWebRequest.Create("http://localhost:32100/Service1.svc");
                string param =  "<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:wcf="http://schemas.datacontract.org/2004/07/WcfService2">"
                                +"   <soapenv:Header/>"
                                +"   <soapenv:Body>"
                                +"      <tem:GetDataUsingDataContract>"
                                +"         <!--Optional:-->"
                                +"         <tem:composite>"
                                +"            <!--Optional:-->"
                                +"            <wcf:BoolValue>true</wcf:BoolValue>"
                                +"            <!--Optional:-->"
                                +"            <wcf:StringValue>ddd</wcf:StringValue>"
                                +"         </tem:composite>"
                                +"      </tem:GetDataUsingDataContract>"
                                +"   </soapenv:Body>"
                                +"</soapenv:Envelope>";
                byte[] bs = System.Text.ASCIIEncoding.ASCII.GetBytes(param);
    
                request.Method = "POST";
                request.ContentType = "text/xml;charset=UTF-8";
                request.ContentLength = bs.Length;
    
                //指定要调用http://localhost:32100/Service1.svc服务中的GetDataUsingDataContract方法
                //http://tempuri.org/IService1/GetDataUsingDataContract(名称空间(http://tempuri.org/)/接口名称(IService1)/方法名(GetDataUsingDataContract))
                request.Headers["SOAPAction"] = "http://tempuri.org/IService1/GetDataUsingDataContract"; 
    
    
                using(Stream reqStream = request.GetRequestStream())
                {
                    reqStream.Write(bs, 0, bs.Length);
                    reqStream.Close();
                }
    
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding))
                    {
                        responseData = reader.ReadToEnd().ToString();
                    }
                    Console.Write(responseData);
                    Console.ReadKey();
                }
    
    
            }
        }
    }

    当然,上面的例子完全是对请求数据进行硬编码,实际使用还得根据实际情况调整和封装。下图是调用后的结果,就是一堆符合SOAP格式的XML,至于怎么解析我就不说了。

    这里还有一点要提一下的是如何抓取WEBService的请求信息,我是通过SoapUI这个工具来获取的。(没使用过SoapUI???请教度娘吧。。。)

    编写此文的目的:JAVA开发的WebService通过.NET来调用时经常会出现一些莫名其妙的问题(两者标准不一样,不兼容)折腾很久得不到解决,所以只能出此下策了。

  • 相关阅读:
    Vue(知识讲解)
    爬虫框架:scrapy
    爬虫性能相关
    MongoDB
    Beautifulsoup模块
    selenium模块
    requests模块
    爬虫(集锦)
    爬虫目录
    Flask目录
  • 原文地址:https://www.cnblogs.com/huangzelin/p/4550076.html
Copyright © 2020-2023  润新知