最近在做一個項目 ,需要我們做一個東西,我們姑且叫數據共用吧,我們公司叫A公司,對方公司叫B公司,就是A公司提供一個數據服務介面出去,B公司如果想拿我們數據的時候直接調用我們的服務介面就行了,我們同樣要獲取對方B方的數據,直接拿對方的數據,經過協商我們決定採用WCF服務的REST方式進行數據共用,數 ...
最近在做一個項目 ,需要我們做一個東西,我們姑且叫數據共用吧,我們公司叫A公司,對方公司叫B公司,就是A公司提供一個數據服務介面出去,B公司如果想拿我們數據的時候直接調用我們的服務介面就行了,我們同樣要獲取對方B方的數據,直接拿對方的數據,經過協商我們決定採用WCF服務的REST方式進行數據共用,數據格式採用json,POST 方式進行請求
1,首先就是我們要進行發佈我們的數據,如何寫一個WCF REST 服務呢,請看我的這篇文章http://www.cnblogs.com/huchaoheng/p/6379026.html
1)介面如下:
[OperationContract] [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped)] string GetProductListByCategoryName(string categoryName);
2) 實現介面:
JsonConvert真的很厲害,可以將json 與object 進行互換
public string GetProductListByCategoryName(string categoryName) { List<Product> ProductList = Products.Instance.ProductList.Where(t => t.CategoryName == categoryName).ToList(); var result = JsonConvert.SerializeObject(ProductList); return result; }
2,如何發佈一個WCF服務 呢,我們知道WCF服務可以寄存到IIS 上,其實不止是IIS,現在我們姑且寄存到IIS上去,發佈好的程式,啟用32位程式改成True
3,現在我們的服務已經發佈好了,我們該如何進行獲取呢。發佈好的程式 點擊URL 如下圖所示:
1)首先wcf rest 服務相當與一個URL 我們這裡如何進行請求一個URL 呢,我們需要用到 HttpWebRequest ,這個怎麼用,可以參考 http://www.cnblogs.com/kissdodog/archive/2013/04/06/3002779.html 別人寫的博客,還不錯 我們現在要寫自己的請求URL 的方法 ,這樣就可以輕鬆的可以獲取到發佈服務的json 格式
/// <summary> /// huchao /// 數據請求 /// 2017.2.12 /// </summary> /// <param name="url">wcf rest 請求地址</param> /// <param name="parametrds">wcf rest 服務請求參數 此處為json 格式</param> /// <returns></returns> public string GetResponeDataByPost(string url, string parametrds) { //進行數據請求 HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url); httpRequest.ContentType = "application/json"; httpRequest.Method = "POST"; byte[] payload; payload = Encoding.UTF8.GetBytes(parametrds); httpRequest.ContentLength = payload.Length; Stream pRequestStream = httpRequest.GetRequestStream(); pRequestStream.Write(payload, 0, payload.Length); pRequestStream.Close(); //獲得相應 HttpWebResponse httpRespone = (HttpWebResponse)httpRequest.GetResponse(); var myStream = httpRespone.GetResponseStream(); StreamReader StreamReader = new StreamReader(myStream, Encoding.UTF8); var data = StreamReader.ReadToEnd(); StreamReader.Close(); myStream.Close(); return data; }
2)下麵我們要寫個類進行傳入url 還有我們的參數
public List<Product> GetObject(string servicesFullUrl, Object ParamInput) { var ParamInputs = JsonConvert.SerializeObject(ParamInput); string s = GetResponeDataByPost(servicesFullUrl, ParamInputs); return JsonConvert.DeserializeObject<List<Product>>(s); }
這樣是否能得到我們想要的結果呢,此處得到的s為下麵圖所示:
我們調用 JsonConvert.DeserializeObject<List<Product>>(s); 會報錯: 因為上面的得到json 並不能直接反序列化到list 需要我們稍微處理下:參考博客:http://blog.csdn.net/yyixin/article/details/7243472
/// <summary> /// json 反序列化到Dictionary /// </summary> /// <param name="strJson"></param> /// <returns></returns> public Dictionary<string, string> JsonToDictionary (string strJson) { JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); return jsSerializer.Deserialize<Dictionary<string, string>>(strJson); }
3)上面的方法重新寫為
重新輸入參數
GetObject("http://localhost:8011/ProductRESTService.svc/GetProductListByCategoryName", new
{
categoryName = "Category 1",
});
然後就可以獲取到發佈的數據 此處註意 categoryName 必須和發佈的程式的 參數名稱 categoryName 相同,否則數據獲取不到.
歡迎大家留言,我將第一時間進行回覆