1. 程式人生 > >C# 調用Java接口

C# 調用Java接口

mes 如果 cli c# response 工具 嚴重 code 區分

最近工作任務中包含了系統之間數據的互通,當然就考慮系統互相開通接口來實現通信了!

作為.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接口