c# HTTP請求方法(GET,POST,PUT,DELETE)

目錄

什麼是REST?

什麼是Restful?

爲什麼使用Restful?

客戶端請求REST模式的WEB SERVICE接口

GET和POST的區別:

c# 請求代碼


最近經常對接restful風格的API,本身對rest也比較陌生,所以總結下使用過程中看過的資料,話不多說,我們先來了解下REST

PS(REST:是一組架構約束條件和原則,REST是Roy Thomes Fielding在他2000年的博士論文中提出的。Roy Thomas Fielding是HTTP協議(v1.0和v1.1)的主要設計者、Apache服務器作者之一、Apache基金會第一任主席。)

什麼是REST?

REST不是”rest”這個單詞,而是幾個單詞的縮寫 REpresentation State Transfer,直接翻譯:表現層狀態轉移,這個翻譯不太好理解。網上找到一個比較通俗的說法是:URL定位資源,用HTTP動詞(GET,POST,DELETE,PUT等)描述操作 。REST最大的幾個特點爲:資源、統一接口、URI和無狀態。

什麼是Restful?

Restful基於REST構建的API就是Restful風格。

爲什麼使用Restful?

(1). 有的團隊之前一直使用JSP作爲表現層,但是這樣的技術限制了他們的開發效率,他們需要將前端組給出靜態html頁面轉換爲jsp頁面,並且寫一些js代碼,甚至是一些前端代碼。這樣會嚴重限制他們的開發效率,也不能讓後端組專注於業務功能的開發,所以目前越來越多的互聯網公司開始實行前後端分離。

(2). 近年隨着移動互聯網的發展,各種類型的客戶端層出不窮,Restful可以通過一套統一的接口爲PC、微信(H5)、IOS和Android提供服務,這樣的接口不需要前端樣式,只提供數據。

客戶端請求REST模式的WEB SERVICE接口

客戶端的HTTP的請求方式一般分爲四種:GET、POST、PUT、DELETE,這四種請求方式有什麼不同呢。簡單的說,GET就是獲取資源,POST就是創建資源,PUT就是更新資源,DELETE就是刪除資源。具體來說:

  PUT:PUT請求是向服務器端發送數據的,從而改變信息,該請求就像數據庫的update操作一樣,用來修改數據的內容,但是不會增加數據的種類等,也就是說無論進行多少次PUT操作,資源不會增加。

  DELETE:DELETE請求顧名思義,就是用來刪除某一個資源的,該請求就像數據庫的delete操作。

  GET:GET操作是安全的。所謂安全是指不管進行多少次操作,資源的狀態都不會改變,GET只是訪問和查看資源。

  POST:操作不是安全的,每次請求都會創建資源,當我們多次發出POST請求後,其結果是創建出了多個資源。還有一點需要注意的就是,創建操作可以使用POST,也可以使用PUT,區別在於POST 是作用在一個集合資源之上的(/uri),而PUT操作是作用在一個具體資源之上的(/uri/xxx),再通俗點說,如果URL可以在客戶端確定,那麼就使用PUT,如果是在服務端確定,那麼就使用POST,比如說很多資源使用數據庫自增主鍵作爲標識信息,而創建的資源的標識信息到底是什麼只能由服務端提供,這個時候就必須使用POST。 

GET和POST的區別:

  1、GET請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,如:getCitycode?lat=100.22&lon=35.33

POST把提交的數據則放置在是HTTP包的包體中。
  2、在瀏覽器上,GET方式提交的數據是有限制的,例如有時候請求的URL太長,會返回錯誤;但如果是客戶端GET請求,是沒有數據的限制的。POST沒有限制,可傳較大量的數據。
  3、POST的安全性要比GET的安全性高。這裏所說的安全性和上面GET提到的“安全”不是同個概念。上面“安全”的含義僅僅是不作數據修改,而這裏安全的含義是真正的Security的含義,比如:通過GET提交數據,用戶名和密碼將明文出現在URL上,查看瀏覽器的歷史紀錄,就可以查看到GET請求的參數,比如登錄的帳號密碼、搜索關鍵字、個人信息等。

PUT和POST方法語義中都有修改資源狀態的意思,因此都不是安全的。但是PUT方法是冪等的,POST方法不是冪等的,這麼設計的理由是:HTTP協議規定,POST方法修改資源狀態時,URL指示的是該資源的父級資源,待修改資源的ID信息在請求體中攜帶。而PUT方法修改資源狀態時,URL直接指示待修改資源。因此,同樣是創建資源,重複提交POST請求可能產生兩個不同的資源,而重複提交PUT請求只會對其URL中指定的資源起作用,也就是隻會創建一個資源。

c# 請求代碼

    public class RestClient
    {
        private static string BaseUri;
        public RestClient(string baseUri)
        {
            BaseUri = baseUri;
        }


        #region Delete
        private static string Delete(string uri, string data = "")
        {
            string serviceUrl = "";
            if (BaseUri == "" || BaseUri == null)
            {
                serviceUrl = uri;
            }
            else
            {
                serviceUrl = string.Format("{0}/{1}", BaseUri, uri);
            }
            return CommonHttpRequest(serviceUrl, "DELETE", data);
        }
        #endregion

        #region Put
        private static string Put(string uri, string data)
        {
            string serviceUrl = "";
            if (BaseUri == "" || BaseUri == null)
            {
                serviceUrl = uri;
            }
            else
            {
                serviceUrl = string.Format("{0}/{1}", BaseUri, uri);
            }
            return CommonHttpRequest(serviceUrl, "PUT", data);
        }
        #endregion

        #region POST
        private static string Post(string uri, string data)
        {
            string serviceUrl = "";
            if (BaseUri == "" || BaseUri == null)
            {
                serviceUrl = uri;
            }
            else
            {
                serviceUrl = string.Format("{0}/{1}", BaseUri, uri);
            }
            return CommonHttpRequest(serviceUrl, "Post", data);
        }
        #endregion

        #region GET
        private static string Get(string uri)
        {
            string serviceUrl = "";
            if (BaseUri == "" || BaseUri == null)
            {
                serviceUrl = uri;
            }
            else
            {
                serviceUrl = string.Format("{0}/{1}", BaseUri, uri);
            }


            return CommonHttpRequest(serviceUrl, "GET");
        }
        #endregion

        #region  私有方法
        private static string CommonHttpRequest(string url, string type, string data = "")
        {
            HttpWebRequest myRequest = null;
            Stream outstream = null;
            HttpWebResponse myResponse = null;
            StreamReader reader = null;
            try
            {
                //構造http請求的對象
                myRequest = (HttpWebRequest)WebRequest.Create(url);


                //設置
                myRequest.ProtocolVersion = HttpVersion.Version11;
                myRequest.Method = type;


                if (data.Trim() != "")
                {
                    //myRequest.ContentType = "text/xml";
                    myRequest.ContentType = @"application/json";
                    myRequest.MediaType = "application/json";
                    myRequest.Accept = "application/json";
                    myRequest.Timeout = 500000;

                    myRequest.Headers["Accept-Language"] = "zh-CN,zh;q=0.";
                    myRequest.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";

                    //轉成網絡流
                    byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
                    myRequest.ContentLength = buf.Length;
                    outstream = myRequest.GetRequestStream();
                    outstream.Flush();
                    outstream.Write(buf, 0, buf.Length);
                    outstream.Flush();
                    outstream.Close();
                }
                // 獲得接口返回值
                myResponse = (HttpWebResponse)myRequest.GetResponse();
                reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
                string ReturnXml = reader.ReadToEnd();
                reader.Close();
                myResponse.Close();
                myRequest.Abort();
                return ReturnXml;
            }
            catch (WebException wex)
            {
                // throw new Exception();
                if (outstream != null) outstream.Close();
                if (reader != null) reader.Close();
                if (myResponse != null) myResponse.Close();
                if (myRequest != null) myRequest.Abort();
                string pageContent = new StreamReader(wex.Response.GetResponseStream()).ReadToEnd().ToString();
                return "錯誤:" + pageContent;
            }
        }
        #endregion

        #region 通用請求
        /// <summary>
        /// Http通用請求
        /// </summary>
        /// <param name="url"></param>
        /// <param name="type"></param>
        /// <param name="inputData"></param>
        /// <returns></returns>
        public static string HttpRequest(string url, HttpType type, string inputData = "")
        {
            switch (type)
            {
                case HttpType.PUT:
                    return Put(url, inputData);
                case HttpType.GET:
                    return Get(url);
                case HttpType.POST:
                    return Post(url, inputData);
                case HttpType.DELETE:
                    return Delete(url, inputData);
                default:
                    break;
            }
            return "";
        }


        /// <summary>
        /// Http通用請求
        /// </summary>
        /// <param name="ip"></param>
        /// <param name="port"></param>
        /// <param name="uri"></param>
        /// <param name="type"></param>
        /// <param name="inputData"></param>
        /// <returns></returns>
        public static string HttpRequest(string ip, string port, string uri, HttpType type, string inputData = "")
        {
            string url = "http://" + ip + ":" + port + uri;
            return HttpRequest(url, type, inputData);
        }


        #endregion


        public enum HttpType
        {
            PUT = 0,
            GET = 1,
            POST = 2,
            DELETE = 3
        }
    }

參考:

restful風格的API

REST模式中HTTP請求方法(GET,POST,PUT,DELETE)

c# Http Get Post Put Delete類整理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章