记 HttpRequest通过OAuth2客户端模式向对方API提交数据

任务到我这里就剩个API文档,啥对接的人也没有,唯一的沟通方式就是让咱们业务去问对方有没有收到数据信息。API内容就是账户密码,请求地址,请求模式,数据传输的KV格式要求。咱也没弄过这个,花一天时间看了各种资料。

废话不多说,我这边从测试到传数据分了三步,90%的代码来自CtrlC V
一:POSTMAN测试地址是否正常
二:Token的获取
三:数据的上传

一:POSTMAN测试API地址,传入对应参数,返回200,并附带了信息就表示地址可以正常请求,咱就进入下一步。

二:Token的获取,这东西就等于获取一个通行证,有了通行证你才可以向对方的API发送或者请求数据。
这是对方API的Token获取要求;

       Url:http://api/xxxxxxxxxxxxxxxx/token
       Type:POST
       Http header:
       Authorization: Basic Base64(key:secret)
       Content-Type: application/x-www-form-urlencoded
        
        Payload:
        grant_type = client_credentials 

下面是我请求token的内容:

    public static TokenModel HttpRequestGetTokenByOAuth_Credentials(string Key,string Secret)
    {
        System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
        string result = string.Empty;
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(RequestTokenUrl);
        //设置请求方式:post/get
        httpWebRequest.Method = "POST";
        httpWebRequest.AllowAutoRedirect = false;
        string basicstr = Key + ":" + Secret;//拼接要求的Key:Secret 
        string base64 = Convert.ToBase64String(Encoding.Default.GetBytes(basicstr));//转为base64
        httpWebRequest.Headers.Add("Authorization", "Basic " + base64);//注意Basic后面要带空格
        httpWebRequest.ContentType = "application/x-www-form-urlencoded";
        //文档要求的Credentials模式
        httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
        //post参数
        StringBuilder postParam = new StringBuilder();
        //Payload要求
        Dictionary<string, string> parameters = new Dictionary<string, string> { { "grant_type", "client_credentials" } };//传入Payload:需要的参数或数据
        int i = 0;
        foreach (KeyValuePair<string, string> parameter in parameters)
        {
            if (i > 0)
                postParam.Append("&");
            postParam.AppendFormat("{0}={1}", parameter.Key, HttpUtility.UrlEncode(parameter.Value));
            i++;
        }
        byte[] postData = Encoding.UTF8.GetBytes(postParam.ToString());
        httpWebRequest.ContentLength = postData.Length;
        try
        {
            //传输数据
            Stream requesStream = httpWebRequest.GetRequestStream();
            requesStream.Write(postData, 0, postData.Length);
            requesStream.Close();
            //获取返回信息
            HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream stream = response.GetResponseStream();
                if (stream != null)
                {
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        result = reader.ReadToEnd();
                        reader.Close();
                    }
                    stream.Close();
                }
            }
        }
        catch (WebException ex)
        {
          writestr("获取Token出错:"+ex.Message);
        }
        Token = !string.IsNullOrWhiteSpace(result) ? JObject.Parse(result)["access_token"].Value<string>() : "";//赋值Token全局变量
        RefreshTokenTime = DateTime.Now.AddMinutes(8);//看别人的文档是有个地址请求验证token是否有效的,我这个没有,就自己用时间判断刷新,有效期10分钟,我设置的8分钟给全局变量
        return JsonConvert.DeserializeObject<TokenModel>(result);//引用了Newtonsoft.json
    }

//刷新token,其实就是判断时间有没有到,重新请求新的token

     public void Check_Refresh_Token()
    {
        //验证Token是否有效,失效后获取新Token
        if (Token != "")
        {
            if (RefreshTokenTime < DateTime.Now)//失效则刷新
            {
                HttpRequestGetTokenByOAuth_Credentials();
            }
        }
        else
        {
            HttpRequestGetTokenByOAuth_Credentials();
        }
    }

//这个里面的字段就是POSTMAN请求成功后得到的

    public class TokenModel
    {
        public string access_token { get; set; }
        public string scope { get; set; }
        public string token_type { get; set; }
        public int expires_in { get; set; }
    }

//下面是传数据的要求与内容:每次上传量不得大于50k

	Http header:
	Authorization: Bearer <Access Token>
	Payload: 
	{
		"header":{
				 "K1":"V1", 
				 "K2":"V2" 
					}, 
		 "Data":
		 [
		    {"k1":"v1","k2":"v2"},
		    {"k1":"v1","k2":"v2"}
		 ]
     }

//传入地址与要提交的数据,datajson就是Payload要求的数据转为json

    public virtual string HttpRequestPostDataByToken(string postUrl, string datajson )
    {
        Check_Refresh_Token();//验证Token
        writestr("【开始上传数据...】");
        string result = string.Empty;
        HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(postUrl);
        httpWebRequest.Method = "POST";
        httpWebRequest.ContentType = "application/json";
        httpWebRequest.AllowAutoRedirect = false;
        httpWebRequest.Headers.Add("Authorization", "Bearer  " + Token);
        httpWebRequest.Credentials = CredentialCache.DefaultCredentials;
        //提交的json
        byte[] postData = Encoding.UTF8.GetBytes(datajson.ToString());
        httpWebRequest.ContentLength = postData.Length;
        try
        {
            //传输数据
            Stream requesStream = httpWebRequest.GetRequestStream();
            requesStream.Write(postData, 0, postData.Length);
            requesStream.Close();
            //获取返回信息
            HttpWebResponse response = (HttpWebResponse)httpWebRequest.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK)
            {
                Stream stream = response.GetResponseStream();
                if (stream != null)
                {
                    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
                    {
                        result = reader.ReadToEnd();
                        reader.Close();
                    }
                    stream.Close();
                }
            }
        }
        catch (WebException ex)
        {
          writestr("数据上传时失败...("+ex.Message+")");
        }
        var resultobj = JsonConvert.DeserializeObject<ResponseJosnModel>(result);
        writestr("【数据上传成功...】[Code:"+resultobj.code+"],[msg:"+resultobj.msg+"]");
        return result;
    }

//返回的

public class ResponseJosnModel
{
    public string code { get; set; }
    public string msg { get; set; }
    public string topic { get; set; }
    public string partition { get; set; }
    public string offset { get; set; }
}

//写日志的

	public static void writestr(string readme)
    {
        if (!Directory.Exists(@"D:\APILog")) { 
            Directory.CreateDirectory(@"D:\APILog");
        }
        StreamWriter dout = new StreamWriter(@"D:\" +     "APILog\\"+DateTime.Now.ToString("yyyyMMdd")+".txt", true);
        dout.Write("\r\n事件:" + readme + "\r\n操作时间:" + System.DateTime.Now.ToString("yyy-MM-dd HH:mm:ss"));
        dout.Close();
    }

获取token和上传数据我单独放在一个类文件里面调用

这边要求弄成windows服务挂在服务器每天执行一次,每次上传小于50k,只能用笨办法每次Select TOP 数据来提交,大家有什么好方案麻烦说说哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值