C#通過HTTP訪問JAVA的控制器
我們今天說的是HTTP協議,但是我不想直接說,為什麼呢?因為其實我們研究技術也不單單就是說直接看程式碼,看技術,實現功能就好,而是說要本著實際業務場景及架構方式和未來軟體發展趨勢等多方面來考慮軟體實現方式。說道HTTP其實它有很多優勢,為什麼這麼說呢,現在企業業務系統大部分都拋棄老的CS架構,因為早期的CS架構系統維護難度大,系統升級難度大,因為客戶端是需要安裝的,維護起來比較分散,所以升級等方面效率較低,為了改變這個狀況BS架構的軟體開始代替傳統的CS架構,因為BS架構的系統並不需要專門的安裝客戶端,對客戶端的配置就沒有了過多的要求,而且系統的運維主要集中的伺服器端,系統更新,升級方便快捷。說完了由來我們就開始進入正題了,先說說不同語言吧,今天我們說說主流的開發BS架構的面相物件語言C#和JAVA,這兩種語言都很強大。都是面向物件的程式語言,無論先學哪一種,只要入門了在學另外一種語言其實都不難,但是如何實現兩種語言間的通訊呢?以前我們都是通過webservice技術來實現不同語言之間的通訊,但是有個問題,就是webservice需要單獨設立站點,使用上維護上都不是特別的友好,無疑增加了系統的維護成本,所以今天我們就說說通過http的方式來實現呼叫,我們知道JAVA是一個開源的生態圈,他有很多很好的框架來幫助我們簡化我們的開發工作,今天就不在這裡主要講解了,今天主要說的事C#如何呼叫JAVA,因為C#是閉源生態,但是微軟為我們提供了很多很好用的類來幫助我們完成這項工作,今天我們就來說說兩個主要的包。using System.Net.Http;using System.Net;這兩個類為我們提供了HTTP的使用類,其中System.Net.Http需要我們手動新增引用,不然是找不到的,我們今天主要說的兩個類HttpWebRequest,HttpClient,這兩個類都能很好的完成我們需要達到的目標,其中HttpWebRequest更底層一點,在講解這兩個類之前,我們先說說HttpWebRequest和HtttRequest的區別,可能有人會很迷惑,這兩各類好像啊,是不是功能也差不多,確實他們都是針對HTTP的,確實功能差不多,但是使用位置和場景完全不同,HttpWebRequest主要是用在客戶端,對GET和POST請求進行處理,而HtttRequest主要用在伺服器端,對請求引數進行接收等操作。所以我們清楚了這兩個類,我麼現在就可以往下說了,現在我們說一下程式碼:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Net.Http; using System.Threading.Tasks; using System.Web.Script.Serialization; namespace ConsoleApplication5 { public class Program { public static void Main(string[] args) { string url = "http://IP:PORT/URI"; //使用HttpWebRequest方式進行呼叫 string param = "KEY=VALUE"; postHttpRequest(url, param); //使用HttpClient方式進行呼叫 List<KeyValuePair<String, String>> paramList = new List<KeyValuePair<String, String>>(); paramList.Add(new KeyValuePair<string, string>("KEY", "VALUE")); postHttpClient(url, paramList); } /* * url:請求的servlet地址,不帶引數 * parm:請求的引數,key=value&key1=value1 * **/ public static void postHttpRequest(string url, string param) { HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"; string requestForm = param; byte[] postdatabyte = Encoding.UTF8.GetBytes(requestForm); request.ContentLength = postdatabyte.Length; request.AllowAutoRedirect = false; request.KeepAlive = true; Stream stream; stream = request.GetRequestStream(); stream.Write(postdatabyte, 0, postdatabyte.Length); stream.Close(); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream, Encoding.UTF8); string str_serializer = streamReader.ReadToEnd(); JavaScriptSerializer _jsonobj = new JavaScriptSerializer(); PermanentBean _obj = _jsonobj.Deserialize<JsonObject>(str_serializer).obj; Console.WriteLine(_obj.permanent_num); } /* * url:請求的servlet地址,不帶引數 * paramList:請求的引數,key=value&key1=value1 * **/ public static void postHttpClient(string _url, List<KeyValuePair<String, String>> paramList) { HttpClient _httpCilent = new HttpClient(); _httpCilent.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:19.0) Gecko/20100101 Firefox/19.0"); HttpResponseMessage _respone = _httpCilent.PostAsync(new Uri(_url), new FormUrlEncodedContent(paramList)).Result; string _result= _respone.Content.ReadAsStringAsync().Result; JavaScriptSerializer _jsonobj = new JavaScriptSerializer(); PermanentBean _obj = _jsonobj.Deserialize<JsonObject>(_result).obj; Console.WriteLine(_obj.permanent_id); } } }