WCF學習之旅—實現支持REST客戶端應用(二十四)

来源:http://www.cnblogs.com/chillsrc/archive/2016/09/15/5874703.html
-Advertisement-
Play Games

為了強調REST的通用性,客戶端不用WCF的形式調用服務,而是採用HttpWebResponse通過編程方式直接訪問,消息格式我們選XML。 ...


            WCF學習之旅—實現REST服務(二十二)

           WCF學習之旅—實現支持REST服務端應用(二十三)

          在上二篇文章中簡單介紹了一下RestFul與WCF支持RestFul所提供的方法,及創建一個支持REST的WCF服務端程式,本文介紹如何調用上一篇文章介紹的RestFul服務端。

 

五、Windows客戶端調用

          為了強調REST的通用性,客戶端不用WCF的形式調用服務,而是採用HttpWebResponse通過編程方式直接訪問,消息格式我們選XML。

         首先,我們使用C#來封裝一個RestHelper類,實現HTTP的GET和POST的請求方法,代碼如下。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;
 

namespace WinClient
{

    public class RestHelper
    {      

            /// <summary>
            /// 構造函數
            /// </summary>
            /// <param name="baseUrl"></param>
            public RestHelper(string baseUri)
            {

                this.BaseUri = baseUri;
            } 

            /// <summary>
            /// 基地址
            /// </summary>
            private string BaseUri; 

            /// <summary>
            /// Post調用
            /// </summary>
            /// <param name="data"></param>
            /// <param name="uri"></param>
            /// <returns></returns>
            public string Post(string data, string uri)
            {

                //Web訪問對象
                string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);

                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);
                //轉成網路流
                byte[] buf = UnicodeEncoding.UTF8.GetBytes(data); 

                //設置
                myRequest.Method = "POST";
                myRequest.ContentLength = buf.Length;
                myRequest.ContentType = "text/html";
 

                // 發送請求
                Stream newStream = myRequest.GetRequestStream();

                newStream.Write(buf, 0, buf.Length);
                newStream.Close(); 

                // 獲得介面返回值
                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

                StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);

                string ReturnXml = HttpUtility.HtmlDecode(reader.ReadToEnd());

                reader.Close();
                myResponse.Close();
                return ReturnXml;

            }

            /// <summary>
            /// Get調用
            /// </summary>
            /// <param name="uri"></param>
            /// <returns></returns>
            public string Get(string uri)
            {

                //Web訪問對象
                string serviceUrl = string.Format("{0}/{1}", this.BaseUri, uri);

            HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(serviceUrl);

             // 獲得介面返回值
              HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();

              StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);

              string ReturnXml = HttpUtility.UrlDecode(reader.ReadToEnd());

              reader.Close();
           myResponse.Close();
           return ReturnXml;
         }
    }

}

 

         其次,我們來實現主函數,按順序調用兩個介面,並顯示返回值。需要註意XML約定的命名空間。

         我們在visual studio 2015中創建一個Windows窗體,名稱為Form1,在Form1中放兩個按鈕,一個是“Rest Get”,另一個是"Rest Post"。

         1)在“Rest Get”按鈕中實現Get方法,代碼如下:

 private void buttonRest_Click(object sender, EventArgs e)
        {
            RestHelper client = new RestHelper("http://127.0.0.1:8888/");

            //Get
            string uriGet = string.Format("Books/Get/{0}", "2");
            string getData = client.Get(uriGet);
            textBoxMsg.Text = getData;
        }

 

     2) 在visual studio 2015中啟動客戶端應用程式,然後使用滑鼠點擊“Rest Get”按鈕,結果如下圖。

 

 

          3)在“Rest Post”按鈕中實現Post方法,代碼如下:    

  private void buttonRestPost_Click(object sender, EventArgs e)
        {

            RestHelper client = new RestHelper("http://127.0.0.1:8888/");
            //Post

            string uriPost = "Books/Add";
            string data = "<Books xmlns=\"http://tempuri.org/\"><AuthorID>1</AuthorID><Category>MS</Category><Name>數學之美(第二版) </Name><Numberofcopies>12</Numberofcopies><Price>37.99</Price><PublishDate>2009-01-11T00:00:00</PublishDate><Rating>A</Rating></Books>";

            string postResult = client.Post(data, uriPost);
            textBoxMsg.Text = "\r\n\r\n\r\n" + postResult;
        }

 

 

       4) 在visual studio 2015中啟動客戶端應用程式,然後使用滑鼠點擊“Rest Post”按鈕,結果如下圖。

 

 

 六、通過瀏覽器來訪問WCF服務

     通過瀏覽器來訪問WCF服務,主要是用jquery實現GET和POST訪問,採用jquery訪問REST服務,消息格式選擇Xml。

      1) 我們在項目目錄下麵創建一個testRest.html文件,文件中的內容如下:

<html>
     <head>
         <script src="../../Scripts/jquery-2.2.3.min.js" type="text/javascript"></script>
         <script type="text/javascript">  

 function AjaxGet() {
                  $.ajax({
                     type: "GET",
                     contentType: "text/xml",
                     url: "http://127.0.0.1:8888/Books/Get/5",                  

                     success: function (data) {
                         alert(data);
                         $("#TextGet").val(data);
                     },

   complete:function(XMLHttpRequest,textStatus){
               alert(XMLHttpRequest.responseText);
               alert(textStatus);            

            },

                     error: function (data) {
                         alert(data);
                     }
                 });

 }

             function HttpPost() {
                 var str = "<Books xmlns=\"http://tempuri.org/\"><AuthorID>1</AuthorID><Category>MS</Category>
<Name>math book ver 1 </Name><Numberofcopies>12</Numberofcopies><Price>47.99</Price><PublishDate>2012-01-11T00:00:00</PublishDate>
<Rating>A</Rating></Books>
"; $.ajax({ type: "POST", contentType: "text/xml", // datatype:"xml", url: "http://127.0.0.1:8888/Books/Add", data: str, success: function (data) { alert(data); $("#TextPost").val(data); }, complete:function(XMLHttpRequest,textStatus){ alert(XMLHttpRequest.responseText); alert(textStatus); }, error: function (data) { alert(data); } }); } </script> <style type="text/css"> #TextGet { width: 700px; } #TextPost { width: 700px; } </style> </head> <body> <input id="ButtonGet" type="button" value="GET" onclick="AjaxGet()" /> <input id="TextGet" type="text" /> <p/> <input id="ButtonPost" type="button" value="POST" onclick="HttpPost()" /> <input id="TextPost" type="text" /> </body> </html>

 

     2)使用瀏覽器IE打開testRest.html,然後點擊“ GET” 按鈕,結果如下圖。

 

 

 

  3)使用瀏覽器IE打開testRest.html,然後點擊“ POST” 按鈕,結果如下圖。

 

 

備註:

       在firefox下麵,怎麼訪問都不成功,都是報405Method not allowed)錯誤信息,在IE下麵訪問正常,具體原因沒找到,如果有知道解決方案的,請留言。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [HttpPost] public ActionResult Create(FormCollection formCollection) { //foreach (string key in formCollection.AllKeys) //{ // Response.Write(key + " ...
  • 到現在,我們已經基本搭建起了項目的框架,但是項目中還存在一個問題,就是儘管層與層之間使用了介面進行隔離,但實例化介面的時候,還是引入了介面實現類的依賴,如下麵的代碼: private IUserService _userService; private IUserService UserServic... ...
  • 之前做過一個桌面翻譯工具,桌面每日一句--桌面翻譯工具(有道翻譯,微軟翻譯,Google翻譯) 獲取金山每日一句,目前因為 金山每日一句頁面改變導致每日一句功能失敗,不過這工具自己用得最多的還是翻譯功能,乾脆把翻譯獨立出來。 另外,最近在逛知乎發現有人分享了必應詞典的第三方api,所以順道拿來完善, ...
  • 新人剛開始學習ASP.NET MVC,若有不足之處希望能得到您的指點,不勝感激! 先來一張項目的層級結構圖: Model:模型層,主要是各種類型、枚舉以及ORM框架,框架完成資料庫和實體類的映射。項目中選用了微軟的開源ORM框架 EntityFramework 6.0 (以下簡稱EF),資料庫則選擇... ...
  • 不常用庫僅作收藏 圖像操作庫 Magick.NET C#的ListView增強組件 ObjectListView Software Protector 是易用的許可證系統 GUI 強大的 C# 組件庫 IKendeLib ...
  • @HtmlHrlper方式創建的標簽,會自動生成一些屬性,其中一些屬性就是關於驗證 如圖示例: 模型註解 通過模型註解後,MVC的驗證,包括前臺客戶端,後臺伺服器的驗證,MVC統統都做了包含,即使用戶在客戶端禁用Javascript,伺服器也會將非法操作進行驗證,當前前提是針對Model實體標識了註 ...
  • 好久沒有寫過Blog, 每天看著開源的Java社區流口水, 心裡滿不是滋味. 終於等到了今年六月份 dotnet core 的正式發佈, 看著dotnet 社區也一步一步走向繁榮, 一片蒸蒸日上的大好景象. 不在綁定Windows, 相信眾位dotneter的春天就要來了 廢話不多說, 早就對dot ...
  • 本配置節相對簡單而且常用 mode的值有如下三種 值 說明 On 指定啟用自定義錯誤。如果未指定 defaultRedirect,用戶將看到一般性錯誤。 Off 指定禁用自定義錯誤。這允許顯示標準的詳細錯誤。 RemoteOnly 指定僅向遠程客戶端顯示自定義錯誤並且向本地主機顯示 ASP.NET ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...