2021-03-22 16:05:40 +08:00
using Assets.Scripts ;
using Newtonsoft.Json ;
using System ;
using System.Collections ;
using System.Collections.Generic ;
using System.IO ;
using System.Net ;
using System.Net.Http ;
using System.Net.Http.Headers ;
using System.Text ;
using System.Threading.Tasks ;
using UnityEngine ;
namespace Assets.Scripts.Apis
{
public abstract class ApiBase
{
private static CookieContainer _cookieCollection = new CookieContainer ( ) ;
public static CookieCollection cookies
{
get
{
return _cookieCollection . GetCookies ( new Uri ( ConfigHelper . Host ) ) ;
}
//set
//{
// _cookieCollection = value;
//}
}
//protected static EasyHttp.Http.HttpClient http;
private static System . Net . Http . HttpClient httpClient ;
private static HttpClientHandler httpClientHandler ;
static ApiBase ( )
{
//http = new EasyHttp.Http.HttpClient();
//http.Request.PersistCookies = true;
httpClientHandler = new HttpClientHandler ( ) ;
httpClientHandler . AutomaticDecompression = DecompressionMethods . GZip | DecompressionMethods . Deflate ;
2021-05-20 20:00:33 +08:00
httpClientHandler . Proxy = WebRequest . GetSystemWebProxy ( ) ;
2021-03-22 16:05:40 +08:00
httpClientHandler . CookieContainer = _cookieCollection ;
httpClientHandler . UseCookies = true ;
2021-04-19 18:16:56 +08:00
//httpClientHandler.CookieContainer.Add(new Uri(ConfigHelper.Host), new Cookie("PowerFun.AUTH", "E1F130A03C0C2F01DF465A17AAA4740E9C44FC5F7C5077AF5A09B5ED29F0CF4FABE44329111C0BDBC6D97A28E7C7C188250265B37D2E6A849D7F0CAC606490648F17DC7FB9C8778BE7217991EBB6304BD543CFEE55084E54CCD634B49F26A751","/"));
2021-04-09 09:44:06 +08:00
2021-03-22 16:05:40 +08:00
httpClient = new System . Net . Http . HttpClient ( httpClientHandler ) ;
httpClient . DefaultRequestHeaders . Accept . Add ( new MediaTypeWithQualityHeaderValue ( "application/json" ) ) ;
2021-08-26 09:29:35 +08:00
HandleHeaders ( httpClient . DefaultRequestHeaders ) ;
2021-03-22 16:05:40 +08:00
}
protected async Task < bool > GetAsFileSync ( string url , string fileName )
{
//var result = await Task.Factory.StartNew(() =>
//{
// var res = http.GetAsFile(ConfigHelper.Host + url, fileName);
// return res;
//});
2021-09-03 13:06:26 +08:00
//return result;
2021-03-22 16:05:40 +08:00
//using (var httpResponseMessage = await httpClient.SendAsync(CreateRequest(url, System.Net.Http.HttpMethod.Get), HttpCompletionOption.ResponseContentRead))
//{
byte [ ] data1 = await GetAsync ( url ) ;
if ( data1 ! = null )
{
using ( var stream = new FileStream ( fileName , FileMode . Create ) )
{
stream . Write ( data1 , 0 , data1 . Length ) ;
}
return true ;
}
return false ;
// return httpResponseMessage.IsSuccessStatusCode;
//}
}
2021-04-30 17:25:28 +08:00
2021-03-22 16:05:40 +08:00
protected async Task < byte [ ] > GetAsync ( string url )
{
2021-04-30 17:25:28 +08:00
//AddLanguage();
2021-04-14 15:02:33 +08:00
var _url = url ;
2021-04-30 17:25:28 +08:00
if ( _url . IndexOf ( "http" ) = = - 1 )
2021-04-14 15:02:33 +08:00
{
_url = ConfigHelper . Host + url ;
}
2021-04-30 17:25:28 +08:00
//var httpResponseMessage = await httpClient.GetAsync(_url, HttpCompletionOption.ResponseContentRead).ConfigureAwait(false);
//if (!httpResponseMessage.IsSuccessStatusCode)
//{
// return null;
//}
//byte[] data1 = await httpResponseMessage.Content.ReadAsByteArrayAsync().ConfigureAwait(false);
//return data1;
//var request = UnityWebRequest.Get(_url);
//request.SetRequestHeader("Language", "en");
//yield return request.Send();
var client = new HttpClient ( httpClientHandler ) ;
client . DefaultRequestHeaders . Add ( "Language" , "en" ) ;
2021-08-26 09:29:35 +08:00
HandleHeaders ( client . DefaultRequestHeaders ) ;
2021-04-30 17:25:28 +08:00
var result = await client . GetByteArrayAsync ( _url ) . ConfigureAwait ( false ) ;
return result ;
2021-03-22 16:05:40 +08:00
}
2021-08-26 09:29:35 +08:00
private static void HandleHeaders ( HttpRequestHeaders defaultRequestHeaders )
{
#if UNITY_ANDROID
2021-09-14 11:14:51 +08:00
defaultRequestHeaders . Add ( "User-Agent" , $"PowerFun UnityApp/{ConfigHelper.AppVersion} Android" ) ;
defaultRequestHeaders . Add ( "Pf-User-Agent" , $"PowerFun UnityApp/{ConfigHelper.AppVersion} Android" ) ;
2021-08-26 09:29:35 +08:00
#elif UNITY_IOS
2021-09-14 11:14:51 +08:00
defaultRequestHeaders . Add ( "User-Agent" , $"PowerFun UnityApp/{ConfigHelper.AppVersion} ios" ) ;
defaultRequestHeaders . Add ( "Pf-User-Agent" , $"PowerFun UnityApp/{ConfigHelper.AppVersion} ios" ) ;
2021-08-26 09:29:35 +08:00
#else
defaultRequestHeaders . UserAgent . Add ( new ProductInfoHeaderValue ( "Unity" , ConfigHelper . AppVersion ) ) ;
#endif
}
2021-03-22 16:05:40 +08:00
protected async Task < byte [ ] > GetUrlAsync ( string url )
{
var httpResponseMessage = await httpClient . GetAsync ( url , HttpCompletionOption . ResponseContentRead ) . ConfigureAwait ( false ) ;
if ( ! httpResponseMessage . IsSuccessStatusCode )
{
return null ;
}
byte [ ] data1 = await httpResponseMessage . Content . ReadAsByteArrayAsync ( ) . ConfigureAwait ( false ) ;
return data1 ;
}
//private HttpResponse Get(string url, object query = null)
//{
// return http.Get(ConfigHelper.Host + url, query);
//}
2021-04-21 16:16:14 +08:00
protected async Task < string > GetStringAsync ( string url )
{
//var result = await Task.Factory.StartNew(() =>
//{
// return Get(url, query);
//});
//return result;
AddLanguage ( ) ;
var response = await httpClient . GetAsync ( ConfigHelper . Host + url , HttpCompletionOption . ResponseContentRead ) . ConfigureAwait ( false ) ;
return await ParseStringAsync ( response ) ;
}
async Task < string > ParseStringAsync ( HttpResponseMessage response )
{
return await response . Content . ReadAsStringAsync ( ) ;
}
2021-03-22 16:05:40 +08:00
protected async Task < T > GetAsync < T > ( string url )
{
//var result = await Task.Factory.StartNew(() =>
//{
// return Get(url, query);
//});
//return result;
AddLanguage ( ) ;
var response = await httpClient . GetAsync ( ConfigHelper . Host + url , HttpCompletionOption . ResponseContentRead ) . ConfigureAwait ( false ) ;
return await ParseJsonAsync < T > ( response ) ;
}
2021-04-06 15:30:36 +08:00
protected async Task < T > GetThirdPartAsync < T > ( string url )
{
AddLanguage ( ) ;
var response = await httpClient . GetAsync ( url , HttpCompletionOption . ResponseContentRead ) . ConfigureAwait ( false ) ;
return await ParseJsonAsync < T > ( response ) ;
}
2021-04-26 16:25:52 +08:00
protected async Task < System . IO . Stream > GetThirdPartStreamAsync ( string url )
{
AddLanguage ( ) ;
var response = await httpClient . GetAsync ( url , HttpCompletionOption . ResponseContentRead ) . ConfigureAwait ( false ) ;
return await response . Content . ReadAsStreamAsync ( ) ;
}
2021-03-22 16:05:40 +08:00
private async Task < T > ParseJsonAsync < T > ( HttpResponseMessage response )
{
var result = await response . Content . ReadAsStringAsync ( ) ;
Console . WriteLine ( result ) ;
2021-06-22 13:50:08 +08:00
return JsonConvert . DeserializeObject < T > ( result , new JsonSerializerSettings {
DateTimeZoneHandling = DateTimeZoneHandling . Local
} ) ;
2021-03-22 16:05:40 +08:00
}
//protected T Post<T>(string url, object data)
//{
// //var stream = new StreamContent()
// var stringContent = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
// AddLanguage();
// var response = httpClient.PostAsync(ConfigHelper.Host + url, stringContent).GetAwaiter()
// .GetResult();
// if (response.IsSuccessStatusCode == false)
// {
// //return default(T);
// throw new Exception($"服务器端返回:{ response.StatusCode }\r\n{ response.RequestMessage }");
// }
// var info = ParseJsonAsync<T>(response).GetAwaiter().GetResult();
// return info;
//}
//protected HttpResponse Post(string url, object data, IList<FileInfo> files)
//{
// var formData = data.ToDictionary();
// IList<FileData> files1 = new List<FileData>();
// foreach (var item in files)
// {
// var fileData = new FileData();
// fileData.FieldName = item.Name;
// fileData.Filename = item.FullName;
// files1.Add(fileData);
// }
// return http.Post(ConfigHelper.Host + url, formData, files1);
//}
//protected async Task<HttpResponse> PostAsync(string url, object data, IList<FileInfo> files)
//{
// var result = await Task.Factory.StartNew(() =>
// {
// return Post(url, data, files);
// });
// return result;
//}
protected string Upload ( string url , object data , IList < string > files )
{
var files1 = new Dictionary < string , Stream > ( ) ;
foreach ( var file in files )
{
//writer.Write( // file header
// $"\r\n--{boundary}\r\nContent-Disposition: " +
// $"form-data; name=\"{ Path.GetFileName(file) }\"; filename=\"{Path.GetFileName(file)}\"\r\n" +
// "Content-Type: application/octet-stream\r\n\r\n");
//writer.Flush();
var fileStream = File . OpenRead ( file ) ;
//fileStream.CopyTo(requestStream);
files1 . Add ( Path . GetFileName ( file ) , fileStream ) ;
}
return Upload ( url , data , files1 ) ;
}
/// <summary>
/// formdata
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <param name="files"></param>
/// <returns></returns>
protected string Upload ( string url , object data , Dictionary < string , Stream > files )
{
//var requestContent = new MultipartFormDataContent();
//foreach (var item in files)
//{
// // here you can specify boundary if you need---^
// //var file = new System.IO.FileInfo(item);
// var bytes = System.IO.File.ReadAllBytes(item);
// var imageContent = new ByteArrayContent(bytes);
// imageContent.Headers.ContentType =
// MediaTypeHeaderValue.Parse(GetMimeType(System.IO.Path.GetExtension(item)));
// requestContent.Add(imageContent, Path.GetFileName(item), Path.GetFileName(item));
//}
//var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(JsonConvert.SerializeObject(data));
//foreach (var item in dict)
//{
// if (item.Value == null) continue;
// requestContent.Add(new StringContent(item.Value.ToString()), item.Key);
//}
//using (var res = await httpClient.PostAsync(ConfigHelper.Host + url, requestContent).ConfigureAwait(false))
//{
// var rrr = await res.Content.ReadAsStringAsync().ConfigureAwait(false);
// return rrr;
//}
var request = ( HttpWebRequest ) WebRequest . Create ( ConfigHelper . Host + url ) ;
request . UserAgent = httpClient . DefaultRequestHeaders . UserAgent . ToString ( ) ;
2021-04-29 22:14:17 +08:00
request . Headers . Add ( "Language" , "en" ) ;
2021-03-22 16:05:40 +08:00
request . CookieContainer = new CookieContainer ( ) ;
foreach ( Cookie item in cookies )
{
request . CookieContainer . Add ( item ) ;
}
var postData = new StringBuilder ( ) ;
var values = JsonConvert . DeserializeObject < Dictionary < string , string > > ( JsonConvert . SerializeObject ( data ) ) ;
foreach ( var item in values )
{
postData . Append ( WebUtility . UrlEncode ( $"{ item.Key }={ item.Value }&" ) ) ;
}
var boundary = $"{Guid.NewGuid():N}" ;
request . ContentType = $"multipart/form-data; {nameof(boundary)}={boundary}" ;
request . Method = "POST" ;
request . AutomaticDecompression = DecompressionMethods . GZip | DecompressionMethods . Deflate ;
//byte[] bytes;
//using (var stream = new MemoryStream())
//using (var writer = new StreamWriter(stream))
//{
// foreach (var ddd in values)
// {
// writer.Write( // put all POST data into request
// $"\r\n--{boundary}\r\nContent-Disposition: " +
// $"form-data; name=\"{ ddd.Key }\"\r\n\r\n{ ddd.Value }");
// }
// foreach (var file in files)
// {
// writer.Write( // file header
// $"\r\n--{boundary}\r\nContent-Disposition: " +
// $"form-data; name=\"{ Path.GetFileName(file) }\"; filename=\"{Path.GetFileName(file)}\"\r\n" +
// "Content-Type: application/octet-stream\r\n\r\n");
// writer.Flush();
// using (var fileStream = File.OpenRead(file))
// fileStream.CopyTo(stream);
// }
// writer.Write($"\r\n--{boundary}--\r\n");
// bytes = stream.ToArray();
//}
//using (Stream postStream = request.GetRequestStream())
//{
// using (var zipStream = new GZipStream(postStream, CompressionMode.Compress))
// {
// zipStream.Write(bytes, 0, bytes.Length);
// }
//}
using ( var requestStream = request . GetRequestStream ( ) )
using ( var writer = new StreamWriter ( requestStream ) )
{
foreach ( var ddd in values )
{
writer . Write ( // put all POST data into request
$"\r\n--{boundary}\r\nContent-Disposition: " +
$"form-data; name=\" { ddd . Key } \ "\r\n\r\n{ ddd.Value }" ) ;
}
foreach ( var file in files )
{
//writer.Write( // file header
// $"\r\n--{boundary}\r\nContent-Disposition: " +
// $"form-data; name=\"{ Path.GetFileName(file) }\"; filename=\"{Path.GetFileName(file)}\"\r\n" +
// "Content-Type: application/octet-stream\r\n\r\n");
//writer.Flush();
//using (var fileStream = File.OpenRead(file))
// fileStream.CopyTo(requestStream);
writer . Write ( // file header
$"\r\n--{boundary}\r\nContent-Disposition: " +
$"form-data; name=\" { file . Key } \ "; filename=\"{ file.Key }\"\r\n" +
"Content-Type: application/octet-stream\r\n\r\n" ) ;
writer . Flush ( ) ;
//using (var fileStream = File.OpenRead(file))
file . Value . CopyTo ( requestStream ) ;
2021-04-29 18:07:30 +08:00
file . Value . Close ( ) ;
2021-03-22 16:05:40 +08:00
}
writer . Write ( $"\r\n--{boundary}--\r\n" ) ;
}
using ( var response = ( HttpWebResponse ) request . GetResponse ( ) )
using ( var responseStream = response . GetResponseStream ( ) )
{
if ( responseStream = = null )
return string . Empty ;
using ( var reader = new StreamReader ( responseStream ) )
return reader . ReadToEnd ( ) ;
}
}
private string GetMimeType ( string extension )
{
if ( extension . Contains ( ".txt" ) )
{
return "text/plain" ;
}
if ( extension . Contains ( ".png" ) )
{
return "image/png" ;
}
return "application/octet-stream" ;
}
//protected async Task<string> PostUrlAsync(string url, string data)
//{
// StringContent stringContent;
// if (data != null)
// {
// stringContent = new StringContent(data, Encoding.UTF8, "application/json");
// }
// else
// {
// stringContent = new StringContent("", Encoding.UTF8);
// }
// var response = await httpClient.PostAsync(url, stringContent).ConfigureAwait(false);
// var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
// return result;
//}
protected async Task < string > PostAsync ( string url , object data )
{
StringContent stringContent ;
if ( data ! = null )
{
stringContent = new StringContent ( JsonConvert . SerializeObject ( data ) , Encoding . UTF8 , "application/json" ) ;
}
else
{
stringContent = new StringContent ( "" , Encoding . UTF8 ) ;
}
AddLanguage ( ) ;
var response = await httpClient . PostAsync ( ConfigHelper . Host + url , stringContent ) . ConfigureAwait ( false ) ;
var result = await response . Content . ReadAsStringAsync ( ) . ConfigureAwait ( false ) ;
return result ;
}
protected async Task < T > PostAsync < T > ( string url , object data )
{
//var result = await Task.Factory.StartNew(() =>
//{
// return Post(url, data);
//});
//new EasyHttp.Http.HttpResponse().Cookies
//return result;
StringContent stringContent ;
if ( data ! = null )
{
var str = JsonConvert . SerializeObject ( data ) ;
stringContent = new StringContent ( str , Encoding . UTF8 , "application/json" ) ;
}
else
{
stringContent = new StringContent ( "" , Encoding . UTF8 ) ;
}
AddLanguage ( ) ;
var response = await httpClient . PostAsync ( ConfigHelper . Host + url , stringContent ) . ConfigureAwait ( false ) ;
//var cookies = response.Headers.GetValues("Set-Cookie");
//if (cookies.Any())
//{
// foreach (var cookie in cookies)
// {
// ApiBase.cookies.Add(cookie)
// }
//}
var info = await ParseJsonAsync < T > ( response ) ;
return info ;
}
//private static HttpRequestMessage CreateRequest(string url, System.Net.Http.HttpMethod method)
//{
// HttpRequestMessage httpRequestMessage1 = new HttpRequestMessage();
// httpRequestMessage1.Method = method;
// Uri uri = new Uri(ConfigHelper.Host + url);
// httpRequestMessage1.RequestUri = uri;
// HttpRequestMessage httpRequestMessage2 = httpRequestMessage1;
// //if (requiresAuthentication)
// // httpRequestMessage2.Headers.Authorization = this._authorization;
// return httpRequestMessage2;
//}
private void AddLanguage ( )
{
httpClient . DefaultRequestHeaders . Remove ( "Language" ) ;
2021-04-29 11:36:30 +08:00
httpClient . DefaultRequestHeaders . Add ( "Language" , "en" ) ;
2021-03-22 16:05:40 +08:00
}
/// <summary>
/// 因为cef调用c#代码, 异步请求在win7上会有问题, 所以写了同步的方法
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public string Get ( string url )
{
var url1 = url ;
if ( url1 . IndexOf ( "http" ) = = - 1 )
{
url1 = ConfigHelper . Host + url1 ;
}
//AddLanguage();
2021-04-21 11:25:52 +08:00
//var request = (HttpWebRequest)WebRequest.Create(url1);
//request.Method = "GET";
////foreach (var item in httpClient.DefaultRequestHeaders)
////{
//// request.Headers.Add(item.Key, item.Value.First());
////}
//request.UserAgent = httpClient.DefaultRequestHeaders.UserAgent.ToString();
//request.Accept = "application/json";
//request.Headers.Add("Language", "en");
//request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
//request.CookieContainer = new CookieContainer();
//foreach (Cookie item in cookies)
2021-03-22 16:05:40 +08:00
//{
2021-04-21 11:25:52 +08:00
// request.CookieContainer.Add(item);
2021-03-22 16:05:40 +08:00
//}
2021-04-21 11:25:52 +08:00
//var res = request.GetResponse();
//using (var stream = new StreamReader(res.GetResponseStream()))
//{
// return stream.ReadToEnd();
//}
var res = GetAsync ( url ) . GetAwaiter ( ) . GetResult ( ) ;
return System . Text . Encoding . UTF8 . GetString ( res ) ;
2021-03-22 16:05:40 +08:00
}
public T Get < T > ( string url )
{
var res = Get ( url ) ;
return Newtonsoft . Json . JsonConvert . DeserializeObject < T > ( res ) ;
}
/// <summary>
/// 因为cef调用c#代码, 异步请求在win7上会有问题, 所以写了同步的方法
/// </summary>
/// <param name="url"></param>
/// <param name="data"></param>
/// <returns></returns>
public string Post ( string url , object data )
{
var request = ( HttpWebRequest ) WebRequest . Create ( ConfigHelper . Host + url ) ;
request . Method = "POST" ;
request . UserAgent = httpClient . DefaultRequestHeaders . UserAgent . ToString ( ) ;
request . Accept = "application/json" ;
2021-07-27 18:36:49 +08:00
request . Headers . Add ( "Language" , "en" ) ;
2021-03-22 16:05:40 +08:00
request . CookieContainer = new CookieContainer ( ) ;
foreach ( Cookie item in cookies )
{
request . CookieContainer . Add ( item ) ;
}
request . ContentType = "application/json" ;
if ( data ! = null )
{
using ( var streamWriter = new StreamWriter ( request . GetRequestStream ( ) ) )
{
streamWriter . Write ( Newtonsoft . Json . JsonConvert . SerializeObject ( data ) ) ;
}
}
else
{
request . ContentLength = 0 ;
}
var res = request . GetResponse ( ) ;
using ( var stream = new StreamReader ( res . GetResponseStream ( ) ) )
{
return stream . ReadToEnd ( ) ;
}
}
public T Post < T > ( string url , object data )
{
return JsonConvert . DeserializeObject < T > ( Post ( url , data ) ) ;
}
protected byte [ ] GetBytes ( string url )
{
HttpWebRequest request = WebRequest . Create ( url ) as HttpWebRequest ;
HttpWebResponse response = request . GetResponse ( ) as HttpWebResponse ;
using ( Stream netStream = response . GetResponseStream ( ) )
{
var data = ( ( MemoryStream ) netStream ) . ToArray ( ) ;
return data ;
}
}
2021-04-06 15:30:36 +08:00
public static void SetCookie ( string cookie )
{
httpClientHandler . CookieContainer . Add ( new Uri ( ConfigHelper . Host ) , new Cookie ( "PowerFun.AUTH" , cookie , "/" ) ) ;
}
2021-03-22 16:05:40 +08:00
}
2021-03-30 17:15:16 +08:00
}