Web Api调用

原文地址链接如下,进行了一些修改:

http://www.cnblogs.com/ck168/p/5652773.html

请求WebApi的方式有两种:一种是通过后台请求api,另一种通过Js直接访问api。

通过后台请求api的方法可以使用HttpClient也可以使用WebRequest的方式。

HttpClient的方式

   public class ControllerHelper : Controller
    {
        /// <summary>
        /// 调用webapi,发送GET请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <param name="webapiAddress">webapi地址</param>
        /// <returns>返回结果</returns>
        public static ADOPResponse HttpGet(string webapiAddress)
        {
            var client = new HttpClient();
            var respString = client.GetStringAsync(webapiAddress).Result;
            return JsonConvert.DeserializeObject<ADOPResponse>(respString);
        }

        /// <summary>
        /// 调用webapi,发送GET请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <typeparam name="T">返回数据类型</typeparam>
        /// <param name="webApiAddress">webapi地址</param>
        /// <param name="deserializer">反序列化ADOPResponse.DataContent的方法,如果不提供将直接进行类型转化</param>
        /// <returns>返回结果</returns>
        public static async Task<T> HttpGetAsync<T>(string webApiAddress, Func<object, T> deserializer = null)
        {
            var client = new HttpClient();
            var respString = await client.GetStringAsync(webApiAddress);
            return ProcessAdopResponse(respString, deserializer);
        }

        /// <summary>
        /// 调用webapi,发送POST请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <param name="webApiAddress">webapi地址</param>
        /// <param name="model">model</param>
        /// <returns></returns>
        public static ADOPResponse HttpPost(string webApiAddress, object model)
        {
            var jsonString = JsonConvert.SerializeObject(model);
            var content = new StringContent(jsonString);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var client = new HttpClient();
            var resp = client.PostAsync(webApiAddress, content).Result;
            var respString = resp.Content.ReadAsStringAsync().Result;
            return JsonConvert.DeserializeObject<ADOPResponse>(respString);
        }

        /// <summary>
        /// 调用webapi,发送POST请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <typeparam name="T">返回数据类型</typeparam>
        /// <param name="webapiAddress">webapi地址</param>
        /// <param name="model">model</param>
        /// <param name="deserializer">反序列化ADOPResponse.DataContent的方法,如果不提供将直接进行类型转化</param>
        /// <returns>返回结果</returns>
        public static async Task<T> HttpPostAsync<T>(string webapiAddress, object model, Func<object, T> deserializer = null)
        {
            var jsonString = JsonConvert.SerializeObject(model);
            var content = new StringContent(jsonString);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var client = new HttpClient();
            var resp = await client.PostAsync(webapiAddress, content);
            var respString = await resp.Content.ReadAsStringAsync();
            return ProcessAdopResponse(respString, deserializer);
        }

        /// <summary>
        /// 调用webapi,发送PUT请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <param name="webApiAddress">webapi地址</param>
        /// <param name="model">model</param>
        /// <returns></returns>
        public static ADOPResponse HttpPut(string webApiAddress, object model)
        {
            var jsonString = JsonConvert.SerializeObject(model);
            var content = new StringContent(jsonString);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var client = new HttpClient();
            var resp = client.PutAsync(webApiAddress, content).Result;
            var respString = resp.Content.ReadAsStringAsync().Result;
            return JsonConvert.DeserializeObject<ADOPResponse>(respString);
        }

        /// <summary>
        /// 调用webapi,发送PUT请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <typeparam name="T">返回数据类型</typeparam>
        /// <param name="webapiAddress">webapi地址</param>
        /// <param name="model">model</param>
        /// <param name="deserializer">反序列化ADOPResponse.DataContent的方法,如果不提供将直接进行类型转化</param>
        /// <returns>返回结果</returns>
        public static async Task<T> HttpPutAsync<T>(string webapiAddress, object model, Func<object, T> deserializer = null)
        {
            var jsonString = JsonConvert.SerializeObject(model);
            var content = new StringContent(jsonString);
            content.Headers.ContentType = new MediaTypeHeaderValue("application/json");

            var client = new HttpClient();
            var resp = await client.PutAsync(webapiAddress, content);
            var respString = await resp.Content.ReadAsStringAsync();
            return ProcessAdopResponse(respString, deserializer);
        }

        /// <summary>
        /// 调用webapi,发送DELETE请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <param name="webApiAddress">webapi地址</param>
        /// <param name="id">id</param>
        /// <returns>返回结果</returns>
        public static ADOPResponse HttpDelete(string webApiAddress, string id)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                throw new ArgumentNullException(id);
            }

            var client = new HttpClient();
            var resp = client.DeleteAsync(webApiAddress.EndsWith("/") ? webApiAddress + id : webApiAddress + "/" + id).Result;
            var respString = resp.Content.ReadAsStringAsync().Result;
            return JsonConvert.DeserializeObject<ADOPResponse>(respString);
        }

        /// <summary>
        /// 调用webapi,发送DELETE请求
        /// <remarks>要求webapi返回Json序列化后的ADOPResponse</remarks>
        /// </summary>
        /// <typeparam name="T">返回数据类型</typeparam>
        /// <param name="webapiAddress">webapi地址</param>
        /// <param name="id">id</param>
        /// <param name="deserializer">反序列化ADOPResponse.DataContent的方法,如果不提供将直接进行类型转化</param>
        /// <returns>返回结果</returns>
        public static async Task<T> HttpDeleteAsync<T>(string webapiAddress, string id, Func<object, T> deserializer = null)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                throw new ArgumentNullException(id);
            }

            var client = new HttpClient();
            var resp = await client.DeleteAsync(webapiAddress.EndsWith("/") ? webapiAddress + id : webapiAddress + "/" + id);
            var respString = await resp.Content.ReadAsStringAsync();
            return ProcessAdopResponse(respString, deserializer);
        }

        /// <summary>
        /// 处理webapi返回的ADOPResponse
        /// </summary>
        /// <typeparam name="T">返回类型</typeparam>
        /// <param name="respJson">返回的Json字符串</param>
        /// <param name="deserializer">反序列化ADOPResponse.DataContent的方法,如果不提供将直接进行类型转化</param>
        /// <returns>返回结果</returns>
        private static T ProcessAdopResponse<T>(string respJson, Func<object, T> deserializer)
        {
            if (string.IsNullOrWhiteSpace(respJson))
            {
                return default(T);
            }

            try
            {
                var adopResp = JsonConvert.DeserializeObject<ADOPResponse>(respJson);
                if (adopResp == null || adopResp.Status != ResponseStatus.Success)
                {
                    return default(T);
                }

                var content = adopResp.DataContent;
                if (content == null)
                {
                    return default(T);
                }

                if (deserializer != null)
                {
                    return deserializer(content);
                }

                return (T)Convert.ChangeType(content, typeof(T));
            }
            catch
            {
                return default(T);
            }
        }
    }
View Code

调用ConfigurationManager

 public class HomeController : Controller
    {
        //
        // GET: /Home
         private readonly string apiRoot = ConfigurationManager.AppSettings["ApiRoot"];
        public ActionResult Index()
        {
            var apiUrl = apiRoot + "ApiBase/GetAllData";

       
            var arrayResult = ControllerHelper.HttpGetAsync<IEnumerable<string>>(apiUrl, (ret) =>
            {
                var rawJArray = ret as JArray;
                return rawJArray == null ? null : rawJArray.ToObject<IEnumerable<string>>();
            }).Result;

            return View(arrayResult);
        }
    }
View Code

WebRequest的方式(该方式是Post请求的时候传入json字符串转换成流的形式,无需再将json转换成需要的实体对象了) 所以这种方式只需写一个公共的方法,每次调用的时候传入地址和参数即可。

公共方法如下:

public class WebRequestHelper
    {
        public static string GetRequest(string url)
        {
            string responseStr = string.Empty;

            WebRequest request = WebRequest.Create(url);
            request.Method = "Get";
            var response = request.GetResponse();
            Stream ReceiveStream = response.GetResponseStream();
            using (StreamReader stream = new StreamReader(ReceiveStream, Encoding.UTF8))
            {
                responseStr = stream.ReadToEnd();
            }

            return responseStr;
        }


        public static string PostRequest(string url, string postParameter)
        {
            string responseStr = string.Empty;

            WebRequest request = WebRequest.Create(url);
            request.Method = "Post";
            request.ContentType = "application/json";

            byte[] requestData = System.Text.Encoding.UTF8.GetBytes(postParameter);
            request.ContentLength = requestData.Length;

            Stream newStream = request.GetRequestStream();
            newStream.Write(requestData, 0, requestData.Length);
            newStream.Close();

            var response = request.GetResponse();
            Stream ReceiveStream = response.GetResponseStream();
            using (StreamReader stream = new StreamReader(ReceiveStream, Encoding.UTF8))
            {
                responseStr = stream.ReadToEnd();
            }

            return responseStr;
        }

        /// <summary>
        /// Http的 WebRequest的特定实现
        /// </summary>
        /// <param name="Url"></param>
        /// <param name="JSONData"></param>
        /// <returns></returns>
        public static string GetResponseData(string Url, string JSONData)
        {
            byte[] bytes = Encoding.UTF8.GetBytes(JSONData);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.ContentLength = bytes.Length;
            request.ContentType = "application/json";
            Stream reqstream = request.GetRequestStream();
            reqstream.Write(bytes, 0, bytes.Length);

            //声明一个HttpWebRequest请求  
            request.Timeout = 90000;
            //设置连接超时时间  
            request.Headers.Set("Pragma", "no-cache");
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream streamReceive = response.GetResponseStream();
            Encoding encoding = Encoding.UTF8;

            StreamReader streamReader = new StreamReader(streamReceive, encoding);
            string strResult = streamReader.ReadToEnd();
            streamReceive.Dispose();
            streamReader.Dispose();

            return strResult;
        }
    }
View Code

 (1)Get请求

public ActionResult GetAll()
        {
            string result = WebRequestHelper.GetRequest(url + "api/goods/getlist?pageindex=0&pagesize=10");
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            var items = Serializer.DeserializeObject(result);
            return Json(items);
        }

 (2)Post请求

[HttpPost]
        public ActionResult AddGood(string paramObj)
        {
            string result = WebRequestHelper.PostRequest(url + "api/goods/add", paramObj);
            JavaScriptSerializer Serializer = new JavaScriptSerializer();
            var items = Serializer.DeserializeObject(result);
            return Json(items);
        }

页面通过JQuery调用

$.ajax({
            type: "get",
            url: "/goods/getall",
            dataType: "json",
            data: null,
            //data: JSON.stringify({
            //    id: "382accff-57b2-4d6e-ae84-a61e00a3e3b6"
            //}),
            contentType: "application/json;charset-utf-8",
            success: function (data) {
                console.log(data);
            }
        });

        var paramObj = { Id: "382accff-57b2-4d6e-ae84-a61e00a3e3b8",Category:111};

        $.ajax({
            type: "post",
            url: "/goods/AddGood",
            dataType: "json",
            //data: null,
            data: JSON.stringify({
                paramObj: JSON.stringify(paramObj)
            }),
            contentType: "application/json;charset-utf-8",
            success: function (data) {
                console.log(data);
            }
        });
View Code

 

转载于:https://www.cnblogs.com/wyanblog/p/6807912.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值