/// <summary>
/// 通过JSON方式发送POST请求
/// 将返回结果按JSON方式解析
/// </summary>
public static class WebClientHelper
{
const string REQUEST_HEADER_BEARER = "bearer"; /// <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); 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;
}
} /// <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); 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))
{
string response = wc.DownloadString(url); if (typeof(T) == typeof(string)) return response as T; 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))
{
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))
{
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.ContentType, "application/json; charset=utf-8");
wc.Headers.Add(HttpRequestHeader.Accept, "*/*");
wc.Headers.Add(HttpRequestHeader.AcceptCharset, "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
if (!string.IsNullOrEmpty(accessToken)) wc.Headers.Add(HttpRequestHeader.Authorization, REQUEST_HEADER_BEARER + " " + 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 = false)
{
string accessToken = bNeedToken ? TokenCache.GetAccessToken() : null;
using (var wc = MyWebClient(accessToken))
{
var b = wc.UploadFile(url, file);
return Encoding.UTF8.GetString(b);
}
} }
public class TokenCache
{
static TokenInfo tokenInfo = new TokenInfo();
static JwtCore jwtCore = new JwtCore(); static ICacheManager<TokenInfo> accessTokenCache = CacheFactory.FromConfiguration<TokenInfo>("tokenCache"); /// <summary>
/// SSO Clock Skew(秒):时钟调整,适配不同服务器之间的时钟偏差
/// </summary>
static readonly int CLOCK_SKEW_IN_SECONDS = int.Parse(ConfigurationManager.AppSettings["SSO:CLOCK_SKEW_IN_SECONDS"]); /// <summary>
/// AppInfo
/// </summary>
static readonly string AppId = ConfigurationManager.AppSettings["AppId"];
static readonly string AppSecret = ConfigurationManager.AppSettings["AppSecret"];
static public string GetAccessToken()
{
lock(tokenInfo)
{
return getAccessToken();
}
} static string getAccessToken()
{
string tokenKey = AppId; var ti = accessTokenCache.Get(tokenKey);
if(ti != null)
{
return ti.Token;
} // request a new access-token
string urlAccessToken = ApiConfig.Instance.GetUrl("sso.access_token");
Debug.Assert(!string.IsNullOrEmpty(urlAccessToken));
SSOAccessTokenReq req = new SSOAccessTokenReq()
{
AppId = AppId,
AppSecret = AppSecret,
//StoreCode,UserCode
}; //try
{
var ret = WebClientHelper.Post<ApiResultT<string>>(urlAccessToken, req, false);
if (ret.IsSuccess())
{
JwtPayload jwtPayload; var ret2 = jwtCore.ValidateToken(ret.data, out jwtPayload);
if (ret2.IsSuccess())
{
tokenInfo.Token = ret.data;
tokenInfo.ExpireAt = jwtPayload.exp; accessTokenCache.Add(tokenKey, tokenInfo); return tokenInfo.Token;
}
throw new Exception("Access Token 无效:" + ret2.ToString());
} throw new Exception("获取Access Token失败:" + ret.ToString());
}
//catch(WebException ex)
//{
// HttpWebResponse httpRep = ex.Response as HttpWebResponse;
// if (httpRep != null)
// {
// if(httpRep.StatusCode == HttpStatusCode.Forbidden)
// { // } // }
//} } internal class TokenInfo
{
public string Token { get; set; } /// <summary>
/// 到期时间:Unix Timestamp
/// </summary>
public long ExpireAt { get; set; }
} }

WebClient请求帮助类的更多相关文章

  1. C# http请求工具类

    /// <summary> /// Http请求操作类之HttpWebRequest /// </summary> public class HttpHelper { #reg ...

  2. WebUtils-网络请求工具类

    网络请求工具类,大幅代码借鉴aplipay. using System; using System.Collections.Generic; using System.IO; using System ...

  3. Http、Https请求工具类

    最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...

  4. 微信https请求工具类

    工作中用到的微信https请求工具类. package com.gxgrh.wechat.tools; import com.gxgrh.wechat.wechatapi.service.System ...

  5. HTTP请求工具类

    HTTP请求工具类,适用于微信服务器请求,可以自测 代码; /// <summary> /// HTTP请求工具类 /// </summary> public class Ht ...

  6. Java请求参数类QueryParameter

    import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; /** * 请求 ...

  7. 实现一个简单的http请求工具类

    OC自带的http请求用起来不直观,asihttprequest库又太大了,依赖也多,下面实现一个简单的http请求工具类 四个文件源码大致如下,还有优化空间 MYHttpRequest.h(类定义, ...

  8. C# 中使用WebClient 请求 https

    WebClient 请求 启用SSL的站点 时,如果站点的证书是不可信的,请求会被阻止,解决办法如下: 添加以下代码: ServicePointManager.ServerCertificateVal ...

  9. 远程Get,Post请求工具类

    1.远程请求工具类   import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.L ...

随机推荐

  1. Knockout学习之组合监控属性

    组合监控属性 顾名思义,就是我们可以将多个属性合并为一个属性.这样在显示的时候就是整体了,并且其中任何一个属性发生改变,这个属性也都会随之发生改变从而更新视图,而这些只需要使用computed函数就可 ...

  2. 7、java5线程池之单一线程池newSingleThreadExecutor

    JDK文档说明: 创建一个使用单个 worker 线程的 Executor,以无界队列方式来运行该线程.(注意,如果因为在关闭前的执行期间出现失败而终止了此单个线程,那么如果需要,一个新线程将代替它执 ...

  3. 转 CentOS下php安装mcrypt扩展

    (以下步骤均为本人实际操作,可能与你的安装方法有所区别,但我会尽量排除疑惑) 大致步骤(1)安装mcrypt,(2)安装php对mcrypt的扩展,(3)重启apache (1).确认你的linux没 ...

  4. CSS的子选择器与后代选择器的区别

    来源于:http://www.jianshu.com/p/599654ba5f4a 子选择器: 一个比较有用的选择器子选择器,即大于符号(>),用于选择指定标签元素的第一代子元素.如右侧代码编辑 ...

  5. (原)ubuntu挂载及开机自动挂载网络端的文件夹的方法

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7160792.html 参考网址: http://blog.csdn.net/tlight/articl ...

  6. 【AI】Computing Machinery and Intelligence - 计算机器与智能

    [论文标题] Computing Machinery and Intelligence (1950) [论文作者] A. M. Turing (Alan Mathison Turing) [论文链接] ...

  7. DPDK架构与特点(转)

    from:http://www.cnblogs.com/mylinuxer/p/4277676.html DPDK架构与特点 当年在某公司实习的时候,当时老大给了我一份DPDK的文档,说是将来很有用, ...

  8. 合格linux运维人员必会的30道shell编程面试题及讲解

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://oldboy.blog.51cto.com/2561410/1632876 超深度 ...

  9. 终极 Shell

    在开始今天的 MacTalk 之前,先问两个问题吧: 1.相对于其他系统,Mac 的主要优势是什么?2.你们平时用哪种 Shell?…… 第一个童靴可以坐下了,Mac 的最大优势是 GUI 和命令行的 ...

  10. Win10下Clion配置opencv3

    本人不想在爱机装一个vs2013或者vs2015这种庞然大物,可是手头要弄一个基于windows的opencv项目,就只好装了个Clion,期间踩了不少坑,记录一下. 参考网址:http://www. ...