/// <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. 无法启动此程序,因为计算机中丢失 api-ms-win-crt-stdio-l1-1-0.dll 解决

    问题描述 最近用一台Windows Server 2012 R2系统的机器的时候碰到了这个问题. 因为在网上看了很多解决方案,都没有很好的解决.所以记录一下这个问题的解决. 之前使用VS2013编译出 ...

  2. 了解 node.js

    原文为: 我们为什么要使用NodeJS 写的好,就收藏于此,供学习之用. 科普文一则,说说我对NodeJS(一种服务端JavaScript实现)的一些认识,以及我为什么会向后端工程师推荐NodeJS. ...

  3. usr/bin/X11各个程序中文详解

    X11程序 animate 输出图形结果 bitmap bmtoa bounce 输出X屏幕保存结果 display 浏览编辑image magick图像 editres 编辑X11资源 flsfon ...

  4. Ubuntu 13.04有线连接异常

    最近安装了Ubuntu 13.04 64位版,发现有线连接经常会掉线,通常在连接上一段时间(或长或短)就无法上网,ping不通,但是ifconfig显示一切正常,重启NetworkManager也不行 ...

  5. IPsec ISAKMP(转)

    IPsec ISAKMP 2010-08-10 11:47:01 标签:IPsec 职场 休闲 ISAKMP Interne 安全连接和密钥管理协议(ISAKMP)是 IPsec 体系结构中的一种主要 ...

  6. MYSQL-innodb性能优化几个点

    MYSQL-innodb性能优化几个点 数据库常用参数 MYSQL数据库的参数配置一般在my.ini配置(部分参数也可以用set  global 参数名=值 做临时调整,重启后失效),配置完后需要重启 ...

  7. 工作8年对技术学习过程的一些 总结 与 感悟 为什么有时迷茫、无奈 学习编程语言的最高境界最重要的是编程思想 T 字发展 学技术忌讳”什么都会“ 每天进步一点等式图 时间管理矩阵

    工作这些年对技术学习过程的一些 总结 与 感悟(一) 引言 工作了8年,一路走来总有些感触时不时的浮现在脑海中.写下来留个痕迹,也顺便给大家一点参考.希望能给初学者一点帮助. 入门 进入计算机行业,起 ...

  8. Redis学习之路(005)- redis内存数据库C客户端hiredis API 中文说明

    A)编译安装 make make install (/usr/local) make install PREFIX=$HOME/progs(可以自由指定安装路径) B)同步的API接口 redisCo ...

  9. 忘记mysqlroot密码/我的电脑 管理服务里面没有mysql启动项/mysql启动不了net start mysql

    http://www.cnblogs.com/andy_tigger/archive/2012/04/12/2443652.html 通过绕过不需密码 http://www.jb51.net/arti ...

  10. 对于“Newtonsoft.Json”已拥有为“NETStander.Library”定义的依赖项,解决办法

    问题描述: 在使用visual studio中的NuGet包管理下载程序时,有时会出现-对于“Newtonsoft.Json”已拥有为“NETStander.Library”定义的依赖项,这样的错误. ...