调用WebApi
可以利用HttpClient来进行Web Api的调用。由于WebA Api的调用本质上就是一次普通的发送请求与接收响应的过程,
所有HttpClient其实可以作为一般意义上发送HTTP请求的工具。
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace 自己的名称空间
{
public class ApiHelper
{
/// <summary>
/// api调用方法/注意一下API地址
/// </summary>
/// <param name="controllerName">控制器名称--自己所需调用的控制器名称</param>
/// <param name="overb">请求方式--get-post-delete-put</param>
/// <param name="action">方法名称--如需一个Id(方法名/ID)(方法名/?ID)根据你的API灵活运用</param>
/// <param name="obj">方法参数--如提交操作传整个对象</param>
/// <returns>json字符串--可以反序列化成你想要的</returns>
public static string GetApiMethod(string controllerName, string overb, string action, object obj = null)
{
Task<HttpResponseMessage> task = null;
string json = "";
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:****/api/" + controllerName + "/");
switch (overb)
{
case "get":
task = client.GetAsync(action);
break;
case "post":
task = client.PostAsJsonAsync(action, obj);
break;
case "delete":
task = client.DeleteAsync(action);
break;
case "put":
task = client.PutAsJsonAsync(action, obj);
break;
default:
break;
}
task.Wait();
var response = task.Result;
if (response.IsSuccessStatusCode)
{
var read = response.Content.ReadAsStringAsync();
read.Wait();
json = read.Result;
}
return json;
}
}
}
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
可能需要以下引用集:
System.Net.Http.Formatting.dll
System.Web.Http.dll
*************************************************
C# HttpClient请求Webapi帮助类
引用 Newtonsoft.Json
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
// Post请求
public string PostResponse(string url,string postData,out string statusCode)
{
string result = string.Empty;
//设置Http的正文
HttpContent httpContent = new StringContent(postData);
//设置Http的内容标头
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//设置Http的内容标头的字符
httpContent.Headers.ContentType.CharSet = "utf-8";
using(HttpClient httpClient=new HttpClient())
{
//异步Post
HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
//输出Http响应状态码
statusCode = response.StatusCode.ToString();
//确保Http响应成功
if (response.IsSuccessStatusCode)
{
//异步读取json
result = response.Content.ReadAsStringAsync().Result;
}
}
return result;
}
// 泛型:Post请求
public T PostResponse<T>(string url,string postData) where T:class,new()
{
T result = default(T);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
using(HttpClient httpClient=new HttpClient())
{
HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
//Newtonsoft.Json
string json = JsonConvert.DeserializeObject(s).ToString();
result = JsonConvert.DeserializeObject<T>(json);
}
}
return result;
}
// 泛型:Get请求
public T GetResponse<T>(string url) where T :class,new()
{
T result = default(T);
using (HttpClient httpClient=new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
string json = JsonConvert.DeserializeObject(s).ToString();
result = JsonConvert.DeserializeObject<T>(json);
}
}
return result;
}
// Get请求
public string GetResponse(string url, out string statusCode)
{
string result = string.Empty;
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = httpClient.GetAsync(url).Result;
statusCode = response.StatusCode.ToString();
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync().Result;
}
}
return result;
}
// Put请求
public string PutResponse(string url, string putData, out string statusCode)
{
string result = string.Empty;
HttpContent httpContent = new StringContent(putData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
statusCode = response.StatusCode.ToString();
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync().Result;
}
}
return result;
}
// 泛型:Put请求
public T PutResponse<T>(string url, string putData) where T : class, new()
{
T result = default(T);
HttpContent httpContent = new StringContent(putData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
using(HttpClient httpClient=new HttpClient())
{
HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
string json = JsonConvert.DeserializeObject(s).ToString();
result = JsonConvert.DeserializeObject<T>(json);
}
}
return result;
}
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
出处:https://blog.csdn.net/sun_zeliang/article/details/81587835
========================================================
我自己把上面的修改下,可以不引用 Newtonsoft.Json ,在POST模式的方法PostWebAPI增加了GZip的支持,请求超时设置,其他的功能可以自己去扩展,增加了简单调用的方式。
后续可以扩展异步方式、HttpWebRequest方式调用Webapi(待完成。。。)
![](https://img-blog.csdnimg.cn/img_convert/961ddebeb323a10fe0623af514929fc1.png)
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
namespace Car.AutoUpdate.Comm
{
public class WebapiHelper
{
#region HttpClient
/// <summary>
/// Get请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <returns></returns>
public static string GetWebAPI(string url)
{
string result = "";
string strOut = "";
try
{
result = GetWebAPI(url, out strOut);
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Get请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <param name="statusCode">Response返回的状态</param>
/// <returns></returns>
public static string GetWebAPI(string url, out string statusCode)
{
string result = string.Empty;
statusCode = string.Empty;
try
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = httpClient.GetAsync(url).Result;
statusCode = response.StatusCode.ToString();
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync().Result;
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Get请求指定的URL地址
/// </summary>
/// <typeparam name="T">返回的json转换成指定实体对象</typeparam>
/// <param name="url">URL地址</param>
/// <returns></returns>
public static T GetWebAPI<T>(string url) where T : class, new()
{
T result = default(T);
try
{
using (HttpClient httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = httpClient.GetAsync(url).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
string jsonNamespace = DeserializeObject<T>(s).ToString();
result = DeserializeObject<T>(s);
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Post请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <param name="postData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <returns></returns>
public static string PostWebAPI(string url, string postData)
{
string result = "";
HttpStatusCode strOut = HttpStatusCode.BadRequest;
try
{
result = PostWebAPI(url, postData, out strOut);
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Post请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <param name="postData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <param name="statusCode">Response返回的状态</param>
/// <returns></returns>
public static string PostWebAPI(string url, string postData, out HttpStatusCode httpStatusCode)
{
string result = string.Empty;
httpStatusCode = HttpStatusCode.BadRequest;
//设置Http的正文
HttpContent httpContent = new StringContent(postData);
//设置Http的内容标头
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//设置Http的内容标头的字符
httpContent.Headers.ContentType.CharSet = "utf-8";
HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
try
{
//using (HttpClient httpClient = new HttpClient(httpHandler))
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 0, 5);
//异步Post
HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
//输出Http响应状态码
httpStatusCode = response.StatusCode;
//确保Http响应成功
if (response.IsSuccessStatusCode)
{
//异步读取json
result = response.Content.ReadAsStringAsync().Result;
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Post请求指定的URL地址
/// </summary>
/// <typeparam name="T">返回的json转换成指定实体对象</typeparam>
/// <param name="url">URL地址</param>
/// <param name="postData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <returns></returns>
public static T PostWebAPI<T>(string url, string postData) where T : class, new()
{
T result = default(T);
HttpContent httpContent = new StringContent(postData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
try
{
using (HttpClient httpClient = new HttpClient(httpHandler))
{
HttpResponseMessage response = httpClient.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
//Newtonsoft.Json
string jsonNamespace = DeserializeObject<T>(s).ToString();
result = DeserializeObject<T>(s);
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Put请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <param name="putData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <returns></returns>
public static string PutWebAPI(string url, string putData)
{
string result = "";
string strOut = "";
result = PutWebAPI(url, putData, out strOut);
return result;
}
/// <summary>
/// Put请求指定的URL地址
/// </summary>
/// <param name="url">URL地址</param>
/// <param name="putData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <param name="statusCode">Response返回的状态</param>
/// <returns></returns>
public static string PutWebAPI(string url, string putData, out string statusCode)
{
string result = statusCode = string.Empty;
HttpContent httpContent = new StringContent(putData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
try
{
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
statusCode = response.StatusCode.ToString();
if (response.IsSuccessStatusCode)
{
result = response.Content.ReadAsStringAsync().Result;
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// Put请求指定的URL地址
/// </summary>
/// <typeparam name="T">返回的json转换成指定实体对象</typeparam>
/// <param name="url">URL地址</param>
/// <param name="putData">提交到Web的Json格式的数据:如:{"ErrCode":"FileErr"}</param>
/// <returns></returns>
public static T PutWebAPI<T>(string url, string putData) where T : class, new()
{
T result = default(T);
HttpContent httpContent = new StringContent(putData);
httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
httpContent.Headers.ContentType.CharSet = "utf-8";
try
{
using (HttpClient httpClient = new HttpClient())
{
HttpResponseMessage response = httpClient.PutAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{
Task<string> t = response.Content.ReadAsStringAsync();
string s = t.Result;
string jsonNamespace = DeserializeObject<T>(s).ToString();
result = DeserializeObject<T>(s);
}
else
{
LogHelper.Warn("调用后台服务返回失败:" + url + Environment.NewLine + SerializeObject(response));
}
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return result;
}
/// <summary>
/// 对象转JSON
/// </summary>
/// <param name="obj">对象</param>
/// <returns>JSON格式的字符串</returns>
public static string SerializeObject(object obj)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
try
{
return jss.Serialize(obj);
}
catch (Exception ex)
{
LogHelper.Error("JSONHelper.SerializeObject 转换对象失败。", ex);
throw new Exception("JSONHelper.SerializeObject(object obj): " + ex.Message);
}
}
/// <summary>
/// 将Json字符串转换为对像
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="json"></param>
/// <returns></returns>
public static T DeserializeObject<T>(string json)
{
JavaScriptSerializer Serializer = new JavaScriptSerializer();
T objs = default(T);
try
{
objs = Serializer.Deserialize<T>(json);
}
catch (Exception ex)
{
LogHelper.Error("JSONHelper.DeserializeObject 转换对象失败。", ex);
throw new Exception("JSONHelper.DeserializeObject<T>(string json): " + ex.Message);
}
return objs;
}
#endregion
private static HttpResponseMessage HttpPost(string url, HttpContent httpContent)
{
HttpResponseMessage response = null;
HttpClientHandler httpHandler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.GZip };
try
{
//using (HttpClient httpClient = new HttpClient(httpHandler))
using (HttpClient httpClient = new HttpClient())
{
httpClient.Timeout = new TimeSpan(0, 0, 5);
//异步Post
response = httpClient.PostAsync(url, httpContent).Result;
}
}
catch (Exception ex)
{
LogHelper.Error("调用后台服务出现异常!", ex);
}
return response;
}
}
}
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
下面再分享一个帮助类,有用到的做个参考吧
![](https://img-blog.csdnimg.cn/img_convert/961ddebeb323a10fe0623af514929fc1.png)
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace WebCollect.CommonHelp
{
public static class CommonHelper
{
#region HttpClient
private static HttpClient _httpClient;
public static HttpClient httpClient
{
get
{
if (_httpClient == null)
{
_httpClient = new HttpClient();
_httpClient.Timeout = new TimeSpan(0, 1, 0);
}
return _httpClient;
}
set { _httpClient = value; }
}
#endregion
#region get请求
/// <summary>
/// get请求返回的字符串
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string GetRequestStr(string url)
{
try
{
var response = httpClient.GetAsync(new Uri(url)).Result;
return response.Content.ReadAsStringAsync().Result;
}
catch (Exception)
{
return null;
}
}
/// <summary>
/// get请求返回的二进制
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static byte[] GetRequestByteArr(string url)
{
try
{
var response = httpClient.GetAsync(new Uri(url)).Result;
return response.Content.ReadAsByteArrayAsync().Result;
}
catch (Exception)
{
return null;
}
}
#endregion
#region post请求
/// <summary>
/// post请求返回的字符串
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static string PostRequestStr(string url)
{
try
{
string contentStr = "";
StringContent sc = new StringContent(contentStr);
sc.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-www-form-urlencoded");//todo
var response = httpClient.PostAsync(new Uri(url), sc).Result;
return response.Content.ReadAsStringAsync().Result;
}
catch (Exception)
{
return null;
}
}
#endregion
}
}
![复制代码](https://img-blog.csdnimg.cn/img_convert/48304ba5e6f9fe08f3fa1abda7d326ab.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)