using System;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
//using System.Text.Json;
using System.Threading.Tasks;
using System.Web;
using System.Windows.Forms;
using Newtonsoft.Json;
using System.Net;
namespace LrGetToken
{
public class APIClient
{
///
/// 请求服务器域名,默认https://api.kingdee.com/
///
private string _baseUrl = "https://api.kingdee.com/";
///
/// 客户Id
///
private string _clientId = "";
///
/// 客户秘钥
///
private string _clientSecret = "";
///
/// 超时时间(秒)
///
public int Timeout { get { return 10; } set { value = 10; } }
///
/// 构造一个API客户端对象
///
/// 客户Id
/// 客户秘钥
/// /// 请求域名
public APIClient(string clientId, string clientSecret, string baseUrl)
{
this._clientId = clientId;
this._clientSecret = clientSecret;
this._baseUrl = baseUrl;
}
///
/// 构造一个API客户端对象
///
/// 客户Id
/// 客户秘钥
public APIClient(string clientId, string clientSecret)
{
this._clientId = clientId;
this._clientSecret = clientSecret;
}
///
/// 发起请求
///
///
///
public async Task Execute(APIRequest request, string api_nonce, string timeStamp)
{
using (HttpClient _client = new HttpClient())
{
_client.Timeout = TimeSpan.FromSeconds((double)Timeout);
BuildRequestHeader(_client.DefaultRequestHeaders, request, api_nonce, timeStamp);
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request);
if (request.Method == HttpMethod.Post)
{
if (string.IsNullOrEmpty(request.File))
{
var json = request.Body == null ? string.Empty : JsonConvert.SerializeObject(request.Body);
return await _client.PostAsync(uri, new StringContent(json, Encoding.UTF8, request.ContentType));
}
else
{
//文件上传
string boundary = "----WebKitFormBoundary{DateTime.Now.Ticks:x}";
MultipartFormDataContent content = new MultipartFormDataContent(boundary);
if (!File.Exists(request.File))
{
throw new Exception("路径不存在:{request.File}");
}
using (FileStream fStream = File.Open(request.File, FileMode.Open, FileAccess.Read))
{
content.Add(new StreamContent(fStream, (int)fStream.Length), "file", Path.GetFileName(request.File));
return await _client.PostAsync(uri, content);
}
}
}
else if (request.Method == HttpMethod.Get)
{
return await _client.GetAsync(uri);
}
else if (request.Method == HttpMethod.Put)
{
var json = request.Body == null ? string.Empty : JsonConvert.SerializeObject(request.Body);
return await _client.PutAsync(uri, new StringContent(json, Encoding.UTF8, request.ContentType));
}
else if (request.Method == HttpMethod.Delete)
{
return await _client.DeleteAsync(uri);
}
else
{
throw new Exception("Method:{request.Method} 参数不支持!");
}
}
}
public string HttpPost(APIRequest request, string ClientID, string outerInstanceId, string api_nonce, string timeStamp)
{
try
{
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?outerInstanceId=" + outerInstanceId;
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri);
request1.ContentType = "application/json";
request1.Method = "POST";
//request1.Headers.Add("Content-Type", "application/json");
request1.Headers.Add("X-Api-ClientID", ClientID);
request1.Headers.Add("X-Api-Auth-Version", "2.0");
request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString());
request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce");
request1.Headers.Add("X-Api-Nonce", api_nonce.ToString());
request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
//string postData = "key1=value1&key2=value2";
//GetHeader(request1, request);
//Stream requestStream = request1.GetRequestStream();
//StreamWriter streamWriter = new StreamWriter(requestStream);
//streamWriter.Write(postDataStr);
//streamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
return retString;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "";
}
}
public string HttpPost1(APIRequest request, string apptoken, string ClientID, string api_nonce, string timeStamp, string postbody)
{
try
{
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path;
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri);
request1.ContentType = "application/json";
request1.Method = "POST";
//request1.Headers.Add("Content-Type", "application/json");
request1.Headers.Add("X-Api-ClientID", ClientID);
request1.Headers.Add("X-Api-Auth-Version", "2.0");
request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString());
request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce");
request1.Headers.Add("X-Api-Nonce", api_nonce.ToString());
request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
request1.Headers.Add("app-token", apptoken);
request1.Headers.Add("X-GW-Router-Addr", "https://tf.jdy.com");
//string postData = "key1=value1&key2=value2";
//GetHeader(request1, request);
//Stream requestStream = request1.GetRequestStream();
//StreamWriter streamWriter = new StreamWriter(requestStream);
//streamWriter.Write(postDataStr);
//streamWriter.Close();
// 写入请求体(body)
using (Stream requestStream = request1.GetRequestStream())
{
using (StreamWriter streamWriter = new StreamWriter(requestStream))
{
streamWriter.Write(postbody); // postDataStr是你要发送的JSON数据
}
}
// 获取响应
HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
// 读取响应内容
using (Stream responseStream = response.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(responseStream))
{
string retString = streamReader.ReadToEnd();
return retString;
}
}
// HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
// Stream responseStream = response.GetResponseStream();
//StreamReader streamReader = new StreamReader(responseStream);
// string retString = streamReader.ReadToEnd();
// streamReader.Close();
// responseStream.Close();
//return retString;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return "";
}
}
// 定义一个委托,确保能够跨线程调用
public delegate void UpdateResponseTextDelegate(string response);
public string SaveBill(APIRequest request, string ClientID, string appToken, string api_nonce, string timeStamp,string billContent)
{
try
{
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path;
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri);
request1.ContentType = "application/json";
request1.Method = "POST";
// GetHeader1(request1, request, api_nonce, timeStamp);
//request1.Headers.Add("Content-Type", "application/json");
request1.Headers.Add("X-Api-ClientID", ClientID);
request1.Headers.Add("X-Api-Auth-Version", "2.0");
request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString());
request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce");
request1.Headers.Add("X-Api-Nonce", api_nonce.ToString());
request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
request1.Headers.Add("app-token", appToken);
//request1.Headers.Add("X-GW-Router-Addr", "https://tf.jdy.com");
// string postData = "key1=value1&key2=value2";
if (billContent != "")
{
byte[] byteArray = Encoding.UTF8.GetBytes(billContent);
request1.ContentLength = byteArray.Length;
Stream dataStream = request1.GetRequestStream();
// Write the data to the request stream
dataStream.Write(byteArray, 0, byteArray.Length);
// Close the Stream object
dataStream.Close();
//Stream requestStream = request1.GetRequestStream();
//StreamWriter streamWriter = new StreamWriter(requestStream);
//streamWriter.Write(billContent);
//streamWriter.Close();
}
//GetHeader(request1, request);
//Stream requestStream = request1.GetRequestStream();
//StreamWriter streamWriter = new StreamWriter(requestStream);
//streamWriter.Write(postDataStr);
//streamWriter.Close();
HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(responseStream);
string retString = streamReader.ReadToEnd();
streamReader.Close();
responseStream.Close();
return retString;
}
catch (Exception ex)
{
Console.WriteLine("Error Message: " + ex.Message);
if (ex is WebException webEx)
{
if (webEx.Response != null)
{
using (var responseStream = webEx.Response.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
string responseBody = reader.ReadToEnd();
Console.WriteLine("Response Body: " + responseBody);
}
}
}
return "";
}
}
public string HttpGet(APIRequest request, string api_nonce, string timeStamp)
{
try
{
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request);
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri);
GetHeader(request1, request, api_nonce, timeStamp); //加入header
HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(myResponseStream);
string retString = streamReader.ReadToEnd();
streamReader.Close();
myResponseStream.Close();
return retString;
}
catch (Exception ex)
{
Console.WriteLine("Error Message: " + ex.Message);
if (ex is WebException webEx)
{
if (webEx.Response != null)
{
using (var responseStream = webEx.Response.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
string responseBody = reader.ReadToEnd();
Console.WriteLine("Response Body: " + responseBody);
}
}
}
return "";
}
}
public string HttpGet_pur_in(APIRequest request)
{
try
{
var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request);
HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri);
// GetHeader(request1, request, api_nonce, timeStamp); //加入header
HttpWebResponse response = (HttpWebResponse)request1.GetResponse();
Stream myResponseStream = response.GetResponseStream();
StreamReader streamReader = new StreamReader(myResponseStream);
string retString = streamReader.ReadToEnd();
streamReader.Close();
myResponseStream.Close();
return retString;
}
catch (Exception ex)
{
Console.WriteLine("Error Message: " + ex.Message);
if (ex is WebException webEx)
{
if (webEx.Response != null)
{
using (var responseStream = webEx.Response.GetResponseStream())
using (var reader = new StreamReader(responseStream))
{
string responseBody = reader.ReadToEnd();
Console.WriteLine("Response Body: " + responseBody);
}
}
}
return "";
}
}
private void GetHeader1(HttpWebRequest request1, APIRequest request, string api_nonce, string timeStamp)
{
//var api_nonce = new Random().Next(100000000, 999999999);
//var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds;
request1.Headers.Add("X-Api-ClientID", _clientId);
request1.Headers.Add("X-Api-Auth-Version", "2.0");
request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString());
request1.Headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp");
request1.Headers.Add("X-Api-Nonce", api_nonce.ToString());
request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
//headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/");
if (request.Header.Any())
{
foreach (var hk in request.Header.Keys)
{
request1.Headers.Add(hk, request.Header[hk]);
}
}
}
private void GetHeader(HttpWebRequest request1, APIRequest request, string api_nonce, string timeStamp)
{
//var api_nonce = new Random().Next(100000000, 999999999);
//var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds;
request1.Headers.Add("X-Api-ClientID", _clientId);
request1.Headers.Add("X-Api-Auth-Version", "2.0");
request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString());
request1.Headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp");
request1.Headers.Add("X-Api-Nonce", api_nonce.ToString());
request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
//headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/");
if (request.Header.Any())
{
foreach (var hk in request.Header.Keys)
{
request1.Headers.Add(hk, request.Header[hk]);
}
}
}
public void BuildRequestHeader(HttpRequestHeaders headers, APIRequest request, string api_nonce, string timeStamp)
{
//var api_nonce = new Random().Next(100000000, 999999999);
//var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds;
headers.Add("X-Api-Nonce", api_nonce.ToString());
headers.Add("X-Api-Auth-Version", "2.0");
headers.Add("X-Api-TimeStamp", timeStamp.ToString());
headers.Add("X-Api-ClientID", _clientId);
headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString()));
headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp");
headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/");
if (request.Header.Any())
{
foreach (var hk in request.Header.Keys)
{
headers.Add(hk, request.Header[hk]);
}
}
}
public string GetSignature(APIRequest request, string nonce, string timestamp)
{
var querySign = GetQueryString(request, true);
var my_sign = "";
StringBuilder sb = new StringBuilder();
sb.Append(request.Method.ToString().ToUpper());
sb.Append('\n');
sb.Append(PathEncode(request.Path));
sb.Append('\n');
sb.Append(querySign);
sb.Append('\n');
sb.Append("x-api-nonce:" + nonce);
sb.Append('\n');
sb.Append("x-api-timestamp:" + timestamp);
sb.Append('\n');
my_sign = SHAHelper.HmacSHA256(_clientSecret, sb.ToString());
return SHAHelper.HmacSHA256(_clientSecret, sb.ToString());
}
private string PostGetSignature(APIRequest request, string nonce, string timestamp)
{
var querySign = PostGetQueryString(request, true);
StringBuilder sb = new StringBuilder();
sb.Append(request.Method.ToString().ToUpper());
sb.Append('\n');
sb.Append(PathEncode(request.Path));
sb.Append('\n');
sb.Append(querySign);
sb.Append('\n');
sb.Append("x-api-nonce:" + nonce);
sb.Append('\n');
sb.Append("x-api-timestamp:" + timestamp);
sb.Append('\n');
return SHAHelper.HmacSHA256(_clientSecret, sb.ToString());
}
///
/// Url Path部分Url编码
///
///
///
private static string PathEncode(string path)
{
path = HttpUtility.UrlEncode("/" + path.TrimStart('/')).Replace("%2f", "%2F").Replace("%2d", "%2D").Replace("(", "%28").Replace(")", "%29");
return path;
}
///
/// 查询字符串部分拼接
///
///
///
private static string GetQueryString(APIRequest request, bool doubleEncode = false)
{
var querySign = string.Empty;
if (request.Params != null && request.Params.Keys != null)
{
foreach (var key in request.Params.Keys)
{
if (doubleEncode)
{
querySign = querySign
+ "&" + key.ToString() + "="
+ HttpUtility.UrlEncode(HttpUtility.UrlEncode(request.Params[key])).Replace("+", "%20");//.ToUpper();
}
else
{
querySign = querySign
+ "&" + key.ToString() + "="
+ HttpUtility.UrlEncode(request.Params[key]).Replace("+", "%20");//.ToUpper();
}
}
querySign = querySign.TrimStart('&');
}
return querySign;
}
private static string PostGetQueryString(APIRequest request, bool doubleEncode = false)
{
var querySign = string.Empty;
if (request.Params != null && request.Params.Keys != null)
{
foreach (var key in request.Params.Keys)
{
if (doubleEncode)
{
querySign = querySign
+ "&" + key.ToString() + "="
+ HttpUtility.UrlEncode(HttpUtility.UrlEncode(request.Params[key])).Replace("+", "%20").ToUpper();
}
else
{
querySign = querySign
+ "&" + key.ToString() + "="
+ HttpUtility.UrlEncode(request.Params[key]).Replace("+", "%20").ToUpper();
}
}
querySign = querySign.TrimStart('&');
}
return querySign;
}
}
}