/// <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. SpringCloud之搭建配置中心

    一.搭建config-server 1.引入pom <dependencies> <dependency> <groupId>org.springframework ...

  2. SQL Manager Lite可视化工具部分中英对照

    .Refresh //刷新表数据 .compile,//提交数据. .connect to host //链接到服务器 .disconnect from all databases //断开链接 . ...

  3. 设置char变量指定位为0或1

    int GetBit(char c,int i)//取c的第i位 { ; } void SetBit(char & c,int i, int v)//设置c的第i位为v,v是0或1 { if( ...

  4. Linux环境变量加载顺序

    01.环境变量文件描述 /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置./etc ...

  5. 推荐一款VS2008代码增强插件——MetalScroll

    时光如水,岁月如歌.虽然现在已经是2013年底马上就要步入2014了,但还是有很多人在使用VS2008开发项目,今天要推荐一款VS2008(同时支持VS2005,但不支持VS2010)代码增强插件给仍 ...

  6. 【公众号】微信第三方登录(静默授权和非静默授权)(具体代码:U盘 新浪云SAE)

    一.微信联合登录是怎么登录的,有几种登录方式:微信联合登录和微信授权登录[授权登录(非静默授权)与静默授权] [主动授权]:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关 ...

  7. 不让复制是不可能的----js获取选中文字

    在360百科.知乎上经常会遇见禁止复制文本的情形,这能挡住一部分人复制,却挡不住程序员的复制. HTML都给我了,难道一小段文本我都拿不下来吗? F12打开控制台,然后选中文本,在控制台下粘贴以下代码 ...

  8. 一个worker thread服务一个客户端

    服务器端对一个客户端来了就开启一个工作线程,最多可接受64个. 具体看代码: #pragma once #include <winsock.h> #include <stdio.h& ...

  9. 弹窗相应menu点击事件

    #pragma once //演示QQ2009 #define WINDOW_WIDTH 250 //窗口宽度 #define WINDOW_HEIGHT 600 //窗口高度 struct xc_i ...

  10. permission denied (publickey)问题的解决 和 向github添加ssh key

    使用ssh key这种方式进行clone ,pull github上面的项目,使用 git clone或者git pull origin master出现permission denied (publ ...