任务到我这里就剩个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 数据来提交,大家有什么好方案麻烦说说哈。