最近工作任务中包含了系统之间数据的互通,当然就考虑系统互相开通接口来实现通信了!
作为.NET的开发者,还没有调用过Java接口的经历,惭愧惭愧!
话不多说,直接进入正题!
调用webservice接口,.NET最快的方法是什么?
1,当然是添加服务引用了!
填上WSDL地址,代码中new一个xxxxClient对象,找到方法,传入参数,得到结果,very easy!
2,用SvcUtil生成代理类,在Visual Studio工具中找到它!
什么?你找不到?那你去别处找找如何添加它吧,嘿嘿!
同样,输入wsdl地址:
会帮你在你默认设置的路径里生成一个代理类和一个config文件,类名,配置都帮你生成好了!放入你的项目代码中,爽起来!
But,最吓人的“但是”来了!
以上两种方法调用Java的webservice有个严重的问题解决不了!就是方法不支持重载!比如一个Login方法,人家写了三个不同参数的,不好意思,.NET的工具区分不了!也调不通这个方法。到这里我只能说有句MMP当讲不当讲!
B....But难道就不能调用了么!那肯定是不可能的嘛!上网找文章,我擦,到处都是写一堆一堆的,烦不烦!我要用HttpWebRequest,在互联网时代,我们也要跟上时间的步伐,干啥我都用互联网的思维!哈哈!
1,上工具!
2,点SOAP
3,名称随便写,wsdl不用多少了吧!填上!
4,看到了吗?这么多Login!mmp!双击这个request1
得到这个
5,看看是不是提供给你的那些参数,如果是,那么恭喜你,你找对了!
6,填上参数,调一把!嘿,还通了!注意右侧!
7,重点来了!点下面的HTTPLOG!哇塞,Header 和发送的报文全有啦!
8,这玩意儿搞得也太难看了,我要用我的FIDDLER 来模拟它!上工具!
9,找到这个选项卡!
10,按上图从SoapUI,那边把地址,POST/GET,Header,RequestBody全都copy过来!点击EXECUTE,看左边框框,返回200,yes,通了!
11,选中此请求,看右边的Inspectors 一目了然啊!
12,好了,做了这么多工作,干啥呢干啥呢,直接上代码行吗?好好好,来了来了!
我们先打包好HttpWebRequest的header
StringBuilder sb = new StringBuilder(); sb.AppendLine("<soapenv:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:log=\"http://login.webservice.bos.kingdee.com\">"); sb.AppendLine("<soapenv:Header/>"); sb.AppendLine("<soapenv:Body>"); sb.AppendLine("<log:login soapenv:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">"); sb.AppendLine("<userName xsi:type=\"xsd: string\">mes</userName>"); sb.AppendLine("<password xsi:type=\"xsd: string\">mes</password>"); sb.AppendLine("<slnName xsi:type=\"xsd: string\">eas</slnName>"); sb.AppendLine("<dcName xsi:type=\"xsd: string\">eas20170605</dcName>"); sb.AppendLine("<language xsi:type=\"xsd: string\">L2</language>"); sb.AppendLine("<dbType xsi:type=\"xsd: int\">2</dbType>"); sb.AppendLine("</log:login>"); sb.AppendLine("</soapenv:Body>"); sb.AppendLine("</soapenv:Envelope>"); HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); Encoding encoding = Encoding.UTF8; byte[] bs = Encoding.ASCII.GetBytes(sb.ToString()); string responseData = String.Empty; req.Method = "POST"; req.ContentType = "text/xml;charset=UTF-8"; req.ContentLength = bs.Length; req.UserAgent = "Apache-HttpClient/4.1.1(java 1.5)"; req.Headers.Add("Accept-Encoding", "gzip,deflate"); req.Headers.Add("SOAPAction", ""); CookieContainer CookiesContainer = null; if (CookiesContainer == null) { CookiesContainer = new CookieContainer(); } //req.CookieContainer = CookiesContainer; //启用cookie
再传送RequestBody
using (Stream reqStream = req.GetRequestStream()) { reqStream.Write(bs, 0, bs.Length); reqStream.Close(); }
然后发送请求,得到结果!
using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) { responseData = reader.ReadToEnd().ToString(); } } return responseData;
OK,结果如何去分析,我就不用多讲了吧,xml的有xml的工具类,json有json的工具类,C#,强无敌!