C# 調用Java接口
最近工作任務中包含了系統之間數據的互通,當然就考慮系統互相開通接口來實現通信了!
作為.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#,強無敵!
C# 調用Java接口