WebClientHelper是常用的winform中访问WebAPI的自定义帮助类,有Token的web请求请参考下面的帮助类,header中按各自网页要求。
using Newtonsoft.Json;
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;
namespace Infrastructure.Network
{
/// <summary>
/// 通过JSON方式发送POST请求
/// 将返回结果按JSON方式解析
/// </summary>
public static class WebClientHelper
{
const string REQUEST_HEADER_BEARER = "Bearer";
public class ContentType
{
public string Text = "text/plain";
public string JSON = "application/json";
public string Javascript = "application/javascript";
public string XML = "application/xml";
public string TextXML = "text/xml";
public string HTML = "text/html";
}
/// <summary>
/// 通过POST方式调用WEB API
/// 期待返回值为JSON字符串,并自动转换为期望的对象类型
/// 如果想直接获得原始的返回字符串,则T传为string
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="postData">post数据。自动转换为json格式,可以为空</param>
/// <param name="accessToken">调用FIDP API时,需要填写Access Token</param>
/// <returns></returns>
public static T Post<T>(string url, object postData, bool bNeedToken = true) where T : class
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
string postJson = string.Empty;
if (postData != null) postJson = JsonConvert.SerializeObject(postData);
//if (!string.IsNullOrEmpty(accessToken))
// url = string.Concat(url, "?access_token=", accessToken);
string response = wc.UploadString(url, postJson);
if (typeof(T) == typeof(string)) return response as T;
T ret = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(response);
return ret;
}
}
public static string HttpPut(string url, string body)
{
//HttpPost("http://localhost:41558/api/License/Post", "{Code:\"520181198606183828\",Name:\"nameValue\"}");
Encoding encoding = Encoding.UTF8;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "PUT";
request.Accept = "text/html, application/xhtml+xml, */*";
request.ContentType = "application/json";
byte[] buffer = encoding.GetBytes(body);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
public static string HttpPost(string url, string body)
{
//HttpPost("http://localhost:41558/api/License/Post", "{Code:\"520181198606183828\",Name:\"nameValue\"}");
Encoding encoding = Encoding.UTF8;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.Accept = "text/html, application/xhtml+xml, */*";
request.ContentType = "application/json";
byte[] buffer = encoding.GetBytes(body);
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
return reader.ReadToEnd();
}
}
/// <summary>
/// POST的异步版本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <param name="accessToken"></param>
/// <returns></returns>
public static async Task<T> PostAsync<T>(string url, object postData, bool bNeedToken = true) where T : class
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
string postJson = string.Empty;
if (postData != null) postJson = JsonConvert.SerializeObject(postData);
if (!string.IsNullOrEmpty(accessToken))
url = string.Concat(url, "?access_token=", accessToken);
string response = await wc.UploadStringTaskAsync(url, postJson);
if (typeof(T) == typeof(string)) return response as T;
T ret = JsonConvert.DeserializeObject<T>(response);
return ret;
}
}
/// <summary>
/// 通过GET方式调用WEB API
/// 期待返回值为JSON字符串,并自动转换为期望的对象类型
/// 如果想直接获得原始的返回字符串,则T传为string
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="accessToken"></param>
/// <returns></returns>
public static T Get<T>(string url, bool bNeedToken = true) where T : class
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
if (!string.IsNullOrEmpty(accessToken))
url = string.Concat(url, "?access_token=", accessToken);
string response = wc.DownloadString(url);
if (typeof(T) == typeof(string)) return response as T;
if (response.StartsWith("["))
{
response = response.TrimStart(new char[] { '[' });
response = response.TrimEnd(new char[] { ']' });
}
T ret = JsonConvert.DeserializeObject<T>(response);
return ret;
}
}
public static string Get(string url, bool bNeedToken = true)
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
if (!string.IsNullOrEmpty(accessToken))
url = string.Concat(url, "?access_token=", accessToken);
string response = wc.DownloadString(url);
return response;
}
}
/// <summary>
/// GET的异步版本
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="accessToken"></param>
/// <returns></returns>
public static async Task<T> GetAsync<T>(string url, bool bNeedToken = true) where T : class
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
if (!string.IsNullOrEmpty(accessToken))
url = string.Concat(url, "?access_token=", accessToken);
string response = await wc.DownloadStringTaskAsync(url);
if (typeof(T) == typeof(string)) return response as T;
T ret = JsonConvert.DeserializeObject<T>(response);
return ret;
}
}
private static WebClient MyWebClient(string accessToken)
{
var wc = new WebClient { Encoding = Encoding.UTF8 };
wc.Headers.Add(HttpRequestHeader.Accept, "*/*");
wc.Headers.Add("Accept-Encoding", "gzip, deflate");
wc.Headers.Add("Accept-Language", "zh-CN,zh;q=0.9");
wc.Headers.Add(HttpRequestHeader.ContentType, "application/json");
wc.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
if (!string.IsNullOrEmpty(accessToken))
wc.Headers.Add("Token", accessToken);
return wc;
}
/// <summary>
/// 上传文件
/// </summary>
/// <param name="url"></param>
/// <param name="file"></param>
/// <param name="bNeedToken"></param>
/// <returns></returns>
public static string UploadFile(string url, string file, bool bNeedToken = true)
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
if (!string.IsNullOrEmpty(accessToken))
url = string.Concat(url, "?access_token=", accessToken);
var b = wc.UploadFile(url, file);
return Encoding.UTF8.GetString(b);
}
}
/// <summary>
/// 向webapi发送请求执行导入操作
/// </summary>
/// <param name="token">身份验证token</param>
/// <param name="requestUrl">api请求完整路径</param>
/// <param name="bytes">文件byte[]</param>
/// <param name="fileName">文件名称</param>
/// <returns></returns>
public static string PostImage(string token, string requestUrl, byte[] bytes, string fileName)
{
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", token);
ByteArrayContent fileContent = new ByteArrayContent(bytes);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", FileName = fileName };
MultipartFormDataContent content = new MultipartFormDataContent();
content.Add(fileContent);
var result = httpClient.PostAsync(requestUrl, content);
return result.Result.Content.ReadAsStringAsync().Result;
}
}
public class TokenCache
{
static TokenInfo tokenInfo = new TokenInfo();
static public string GetAccessToken()
{
lock (tokenInfo)
{
return getAccessToken();
}
}
//private static string AppId = (new AppConfig()).AppConfigGet("AppId") == null ?
// "DefaultApp" : (new AppConfig()).AppConfigGet("AppId");
static string getAccessToken()
{
//string tokenKey = AppId;
//accessTokenCache.Add(tokenKey, tokenInfo);
return tokenInfo.Token;
}
/// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string objObject)
{
tokenInfo.Token = objObject;
}
internal class TokenInfo
{
public string Token { get; set; }
/// <summary>
/// 到期时间:Unix Timestamp
/// </summary>
public long ExpireAt { get; set; }
}
}
}