原文地址链接如下,进行了一些修改:
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); } } }
调用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); } }
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; } }
(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); } });