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类整理

猜你喜欢

转载自blog.csdn.net/fangyu723/article/details/106668905
今日推荐