chore: 替换 json 解析实现
parent
ca3b19311c
commit
70b3a37fe3
|
@ -0,0 +1,61 @@
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
using LeanCloud.Storage.Internal;
|
||||||
|
|
||||||
|
namespace LeanCloudTests {
|
||||||
|
public class JsonTest {
|
||||||
|
[Test]
|
||||||
|
public void Deserialize() {
|
||||||
|
// 对象类型
|
||||||
|
var obj = JsonConvert.DeserializeObject("{\"id\": 123}");
|
||||||
|
TestContext.Out.WriteLine(obj.GetType());
|
||||||
|
Assert.AreEqual(obj.GetType(), typeof(JObject));
|
||||||
|
// 数组类型
|
||||||
|
var arr = JsonConvert.DeserializeObject("[1, 2, 3]");
|
||||||
|
TestContext.Out.WriteLine(arr.GetType());
|
||||||
|
Assert.AreEqual(arr.GetType(), typeof(JArray));
|
||||||
|
try {
|
||||||
|
// null
|
||||||
|
var na = JsonConvert.DeserializeObject(null);
|
||||||
|
TestContext.Out.WriteLine(na.GetType());
|
||||||
|
} catch (ArgumentNullException) {
|
||||||
|
|
||||||
|
}
|
||||||
|
Assert.Pass();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeserializeDictionary() {
|
||||||
|
//var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>("{\"id\": 123, \"nest\": { \"count\": 1 }}",
|
||||||
|
// new DictionaryConverter());
|
||||||
|
var json = "{\"id\": 123, \"nest\": { \"count\": 1 }, \"arr\": [1, 2, 3], \"na\": null}";
|
||||||
|
TestContext.Out.WriteLine(JsonConvert.DeserializeObject(json).GetType());
|
||||||
|
var obj = JsonConvert.DeserializeObject<object>(json, new LeanCloudJsonConverter());
|
||||||
|
if (obj is IDictionary<string, object>) {
|
||||||
|
var dict = obj as Dictionary<string, object>;
|
||||||
|
TestContext.Out.WriteLine(dict.GetType());
|
||||||
|
TestContext.Out.WriteLine(dict["id"]);
|
||||||
|
TestContext.Out.WriteLine(dict["nest"].GetType());
|
||||||
|
TestContext.Out.WriteLine(dict["arr"].GetType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeserializeList() {
|
||||||
|
var json = "[1, \"hello\", [2, 3, 4], { \"count\": 22 }]";
|
||||||
|
TestContext.Out.WriteLine(JsonConvert.DeserializeObject(json).GetType());
|
||||||
|
var obj = JsonConvert.DeserializeObject<object>(json, new LeanCloudJsonConverter());
|
||||||
|
if (obj is IList<object>) {
|
||||||
|
var arr = obj as List<object>;
|
||||||
|
TestContext.Out.WriteLine(arr.GetType());
|
||||||
|
TestContext.Out.WriteLine(arr[0]);
|
||||||
|
TestContext.Out.WriteLine(arr[1].GetType());
|
||||||
|
TestContext.Out.WriteLine(arr[2].GetType());
|
||||||
|
TestContext.Out.WriteLine(arr[3].GetType());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,7 +21,7 @@ namespace LeanCloudTests {
|
||||||
var obj = AVObject.Create("Foo");
|
var obj = AVObject.Create("Foo");
|
||||||
obj["content"] = "hello, world";
|
obj["content"] = "hello, world";
|
||||||
await obj.SaveAsync();
|
await obj.SaveAsync();
|
||||||
TestContext.Out.WriteLine($"saved at {Thread.CurrentThread.ManagedThreadId}");
|
TestContext.Out.WriteLine($"{obj.ObjectId} saved at {Thread.CurrentThread.ManagedThreadId}");
|
||||||
Assert.NotNull(obj.ObjectId);
|
Assert.NotNull(obj.ObjectId);
|
||||||
Assert.NotNull(obj.CreatedAt);
|
Assert.NotNull(obj.CreatedAt);
|
||||||
Assert.NotNull(obj.UpdatedAt);
|
Assert.NotNull(obj.UpdatedAt);
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<PackageReference Include="nunit" Version="3.11.0" />
|
<PackageReference Include="nunit" Version="3.11.0" />
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="3.11.0" />
|
<PackageReference Include="NUnit3TestAdapter" Version="3.11.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|
|
@ -26,7 +26,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = parameters
|
Content = parameters
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
||||||
if (!decoded.ContainsKey("result"))
|
if (!decoded.ContainsKey("result"))
|
||||||
|
@ -44,7 +44,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = parameters
|
Content = parameters
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
||||||
if (!decoded.ContainsKey("result"))
|
if (!decoded.ContainsKey("result"))
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
namespace LeanCloud.Storage.Internal
|
namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
|
@ -38,15 +39,15 @@ namespace LeanCloud.Storage.Internal
|
||||||
/// <param name="downloadProgress"></param>
|
/// <param name="downloadProgress"></param>
|
||||||
/// <param name="cancellationToken"></param>
|
/// <param name="cancellationToken"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<Tuple<HttpStatusCode, IDictionary<string, object>>> RunCommandAsync(AVCommand command,
|
public async Task<Tuple<HttpStatusCode, T>> RunCommandAsync<T>(AVCommand command,
|
||||||
IProgress<AVUploadProgressEventArgs> uploadProgress = null,
|
IProgress<AVUploadProgressEventArgs> uploadProgress = null,
|
||||||
IProgress<AVDownloadProgressEventArgs> downloadProgress = null,
|
IProgress<AVDownloadProgressEventArgs> downloadProgress = null,
|
||||||
CancellationToken cancellationToken = default(CancellationToken)) {
|
CancellationToken cancellationToken = default) {
|
||||||
|
|
||||||
var request = new HttpRequestMessage {
|
var request = new HttpRequestMessage {
|
||||||
RequestUri = command.Uri,
|
RequestUri = command.Uri,
|
||||||
Method = command.Method,
|
Method = command.Method,
|
||||||
Content = new StringContent(Json.Encode(command.Content))
|
Content = new StringContent(JsonConvert.SerializeObject(command.Content))
|
||||||
};
|
};
|
||||||
|
|
||||||
var headers = await GetHeadersAsync();
|
var headers = await GetHeadersAsync();
|
||||||
|
@ -66,7 +67,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
PrintResponse(response, resultString);
|
PrintResponse(response, resultString);
|
||||||
|
|
||||||
var ret = new Tuple<HttpStatusCode, string>(response.StatusCode, resultString);
|
var ret = new Tuple<HttpStatusCode, string>(response.StatusCode, resultString);
|
||||||
|
|
||||||
var responseCode = ret.Item1;
|
var responseCode = ret.Item1;
|
||||||
var contentString = ret.Item2;
|
var contentString = ret.Item2;
|
||||||
|
|
||||||
|
@ -75,31 +76,29 @@ namespace LeanCloud.Storage.Internal
|
||||||
throw new AVException(AVException.ErrorCode.InternalServerError, contentString);
|
throw new AVException(AVException.ErrorCode.InternalServerError, contentString);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (responseCode < HttpStatusCode.OK || responseCode > HttpStatusCode.PartialContent) {
|
||||||
|
// 错误处理
|
||||||
|
var data = JsonConvert.DeserializeObject<Dictionary<string, object>>(contentString, new LeanCloudJsonConverter());
|
||||||
|
if (data.TryGetValue("code", out object codeObj)) {
|
||||||
|
AVException.ErrorCode code = (AVException.ErrorCode)codeObj;
|
||||||
|
string detail = data["error"] as string;
|
||||||
|
throw new AVException(code, detail);
|
||||||
|
} else {
|
||||||
|
throw new AVException(AVException.ErrorCode.OtherCause, contentString);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (contentString != null) {
|
if (contentString != null) {
|
||||||
IDictionary<string, object> contentJson = null;
|
|
||||||
try {
|
try {
|
||||||
if (contentString.StartsWith("[", StringComparison.Ordinal)) {
|
var data = JsonConvert.DeserializeObject<object>(contentString, new LeanCloudJsonConverter());
|
||||||
var arrayJson = Json.Parse(contentString);
|
return new Tuple<HttpStatusCode, T>(responseCode, (T)data);
|
||||||
contentJson = new Dictionary<string, object> { { "results", arrayJson } };
|
|
||||||
} else {
|
|
||||||
contentJson = Json.Parse(contentString) as IDictionary<string, object>;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new AVException(AVException.ErrorCode.OtherCause,
|
throw new AVException(AVException.ErrorCode.OtherCause,
|
||||||
"Invalid response from server", e);
|
"Invalid response from server", e);
|
||||||
}
|
}
|
||||||
if (responseCode < HttpStatusCode.OK || responseCode > HttpStatusCode.PartialContent) {
|
|
||||||
AVClient.PrintLog("error response code:" + responseCode);
|
|
||||||
int code = (int)(contentJson.ContainsKey("code") ? (int)contentJson["code"] : (int)AVException.ErrorCode.OtherCause);
|
|
||||||
string error = contentJson.ContainsKey("error") ?
|
|
||||||
contentJson["error"] as string : contentString;
|
|
||||||
AVException.ErrorCode ec = (AVException.ErrorCode)code;
|
|
||||||
throw new AVException(ec, error);
|
|
||||||
}
|
|
||||||
return new Tuple<HttpStatusCode, IDictionary<string, object>>(responseCode, contentJson);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Tuple<HttpStatusCode, IDictionary<string, object>>(responseCode, null);
|
return new Tuple<HttpStatusCode, T>(responseCode, default);
|
||||||
}
|
}
|
||||||
|
|
||||||
private const string revocableSessionTokenTrueValue = "1";
|
private const string revocableSessionTokenTrueValue = "1";
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
/// <param name="downloadProgress">Download progress callback.</param>
|
/// <param name="downloadProgress">Download progress callback.</param>
|
||||||
/// <param name="cancellationToken">The cancellation token for the request.</param>
|
/// <param name="cancellationToken">The cancellation token for the request.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<Tuple<HttpStatusCode, IDictionary<string, object>>> RunCommandAsync(AVCommand command,
|
Task<Tuple<HttpStatusCode, T>> RunCommandAsync<T>(AVCommand command,
|
||||||
IProgress<AVUploadProgressEventArgs> uploadProgress = null,
|
IProgress<AVUploadProgressEventArgs> uploadProgress = null,
|
||||||
IProgress<AVDownloadProgressEventArgs> downloadProgress = null,
|
IProgress<AVDownloadProgressEventArgs> downloadProgress = null,
|
||||||
CancellationToken cancellationToken = default(CancellationToken));
|
CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
@ -27,7 +28,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
};
|
};
|
||||||
|
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(task => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(task => {
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
return new AVConfig(task.Result.Item2);
|
return new AVConfig(task.Result.Item2);
|
||||||
}).OnSuccess(task => {
|
}).OnSuccess(task => {
|
||||||
|
|
|
@ -45,11 +45,11 @@ namespace LeanCloud.Storage.Internal
|
||||||
});
|
});
|
||||||
DateTime? createdAt = extractFromDictionary<DateTime?>(mutableData, "createdAt", (obj) =>
|
DateTime? createdAt = extractFromDictionary<DateTime?>(mutableData, "createdAt", (obj) =>
|
||||||
{
|
{
|
||||||
return AVDecoder.ParseDate(obj as string);
|
return (DateTime)obj;
|
||||||
});
|
});
|
||||||
DateTime? updatedAt = extractFromDictionary<DateTime?>(mutableData, "updatedAt", (obj) =>
|
DateTime? updatedAt = extractFromDictionary<DateTime?>(mutableData, "updatedAt", (obj) =>
|
||||||
{
|
{
|
||||||
return AVDecoder.ParseDate(obj as string);
|
return (DateTime)obj;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (mutableData.ContainsKey("ACL"))
|
if (mutableData.ContainsKey("ACL"))
|
||||||
|
|
|
@ -7,6 +7,7 @@ using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud.Storage.Internal
|
namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
|
@ -57,7 +58,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var ret = await AVPlugins.Instance.HttpClient.ExecuteAsync(request, null, null, CancellationToken.None);
|
var ret = await AVPlugins.Instance.HttpClient.ExecuteAsync(request, null, null, CancellationToken.None);
|
||||||
var jsonData = Json.Parse(ret.Item2) as Dictionary<string, object>;
|
var jsonData = JsonConvert.DeserializeObject<Dictionary<string, object>>(ret.Item2, new LeanCloudJsonConverter());
|
||||||
return new FileState {
|
return new FileState {
|
||||||
Name = jsonData["name"] as string,
|
Name = jsonData["name"] as string,
|
||||||
Url = new Uri(jsonData["url"] as string, UriKind.Absolute),
|
Url = new Uri(jsonData["url"] as string, UriKind.Absolute),
|
||||||
|
@ -70,7 +71,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Path = $"files/{state.ObjectId}",
|
Path = $"files/{state.ObjectId}",
|
||||||
Method = HttpMethod.Delete
|
Method = HttpMethod.Delete
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
internal Task<Tuple<HttpStatusCode, IDictionary<string, object>>> GetFileToken(FileState fileState, CancellationToken cancellationToken)
|
internal Task<Tuple<HttpStatusCode, IDictionary<string, object>>> GetFileToken(FileState fileState, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
@ -89,7 +90,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = parameters
|
Content = parameters
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command);
|
||||||
}
|
}
|
||||||
public Task<FileState> GetAsync(string objectId, string sessionToken, CancellationToken cancellationToken)
|
public Task<FileState> GetAsync(string objectId, string sessionToken, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
@ -97,7 +98,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Path = $"files/{objectId}",
|
Path = $"files/{objectId}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(_ =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(_ =>
|
||||||
{
|
{
|
||||||
var result = _.Result;
|
var result = _.Result;
|
||||||
var jsonData = result.Item2;
|
var jsonData = result.Item2;
|
||||||
|
|
|
@ -6,8 +6,7 @@ using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Linq;
|
using Newtonsoft.Json;
|
||||||
using LeanCloud.Storage.Internal;
|
|
||||||
|
|
||||||
namespace LeanCloud.Storage.Internal
|
namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
|
@ -182,7 +181,8 @@ namespace LeanCloud.Storage.Internal
|
||||||
Data = tempStream
|
Data = tempStream
|
||||||
};
|
};
|
||||||
var ret = await AVPlugins.Instance.HttpClient.ExecuteAsync(request, null, null, CancellationToken.None);
|
var ret = await AVPlugins.Instance.HttpClient.ExecuteAsync(request, null, null, CancellationToken.None);
|
||||||
var result = new Tuple<HttpStatusCode, IDictionary<string, object>>(ret.Item1, Json.Parse(ret.Item2) as Dictionary<string, object>);
|
var result = new Tuple<HttpStatusCode, IDictionary<string, object>>(ret.Item1,
|
||||||
|
JsonConvert.DeserializeObject<Dictionary<string, object>>(ret.Item2, new LeanCloudJsonConverter()));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
public static Stream HttpUploadFile(byte[] file, string fileName, out string contentType, out long contentLength, IDictionary<string, object> nvc)
|
public static Stream HttpUploadFile(byte[] file, string fileName, out string contentType, out long contentLength, IDictionary<string, object> nvc)
|
||||||
|
|
|
@ -166,7 +166,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = parameters
|
Content = parameters
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command);
|
||||||
}
|
}
|
||||||
IList<KeyValuePair<string, string>> GetQiniuRequestHeaders(FileState state)
|
IList<KeyValuePair<string, string>> GetQiniuRequestHeaders(FileState state)
|
||||||
{
|
{
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = $"classes/{Uri.EscapeDataString(state.ClassName)}/{Uri.EscapeDataString(state.ObjectId)}",
|
Path = $"classes/{Uri.EscapeDataString(state.ClassName)}/{Uri.EscapeDataString(state.ObjectId)}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
||||||
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = $"classes/{Uri.EscapeDataString(state.ClassName)}/{Uri.EscapeDataString(state.ObjectId)}?{AVClient.BuildQueryString(queryString)}",
|
Path = $"classes/{Uri.EscapeDataString(state.ClassName)}/{Uri.EscapeDataString(state.ObjectId)}?{AVClient.BuildQueryString(queryString)}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
||||||
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Method = state.ObjectId == null ? HttpMethod.Post : HttpMethod.Put,
|
Method = state.ObjectId == null ? HttpMethod.Post : HttpMethod.Put,
|
||||||
Content = objectJSON
|
Content = objectJSON
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
serverState = serverState.MutatedClone(mutableClone => {
|
serverState = serverState.MutatedClone(mutableClone => {
|
||||||
mutableClone.IsNew = t.Result.Item1 == System.Net.HttpStatusCode.Created;
|
mutableClone.IsNew = t.Result.Item1 == System.Net.HttpStatusCode.Created;
|
||||||
|
@ -89,7 +89,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = $"classes/{state.ClassName}/{state.ObjectId}",
|
Path = $"classes/{state.ClassName}/{state.ObjectId}",
|
||||||
Method = HttpMethod.Delete
|
Method = HttpMethod.Delete
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IList<Task> DeleteAllAsync(IList<IObjectState> states,
|
public IList<Task> DeleteAllAsync(IList<IObjectState> states,
|
||||||
|
@ -157,7 +157,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
{ "requests", encodedRequests }
|
{ "requests", encodedRequests }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).ContinueWith(t => {
|
commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).ContinueWith(t => {
|
||||||
if (t.IsFaulted || t.IsCanceled) {
|
if (t.IsFaulted || t.IsCanceled) {
|
||||||
foreach (var tcs in tcss) {
|
foreach (var tcs in tcss) {
|
||||||
if (t.IsFaulted) {
|
if (t.IsFaulted) {
|
||||||
|
|
|
@ -50,7 +50,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
AVUser user,
|
AVUser user,
|
||||||
CancellationToken cancellationToken) where T : AVObject
|
CancellationToken cancellationToken) where T : AVObject
|
||||||
{
|
{
|
||||||
string sessionToken = user != null ? user.SessionToken : null;
|
string sessionToken = user?.SessionToken;
|
||||||
var parameters = query.BuildParameters();
|
var parameters = query.BuildParameters();
|
||||||
parameters["limit"] = 1;
|
parameters["limit"] = 1;
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Path = $"{relativeUri}?{AVClient.BuildQueryString(parameters)}",
|
Path = $"{relativeUri}?{AVClient.BuildQueryString(parameters)}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
return t.Result.Item2;
|
return t.Result.Item2;
|
||||||
});
|
});
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = "sessions/me",
|
Path = "sessions/me",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
||||||
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = "logout",
|
Path = "logout",
|
||||||
Method = HttpMethod.Post
|
Method = HttpMethod.Post
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IObjectState> UpgradeToRevocableSessionAsync(string sessionToken, CancellationToken cancellationToken) {
|
public Task<IObjectState> UpgradeToRevocableSessionAsync(string sessionToken, CancellationToken cancellationToken) {
|
||||||
|
@ -35,7 +35,7 @@ namespace LeanCloud.Storage.Internal {
|
||||||
Path = "upgradeToRevocableSession",
|
Path = "upgradeToRevocableSession",
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t => {
|
||||||
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ using System.Linq;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud.Storage.Internal
|
namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
|
@ -29,7 +30,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
string json;
|
string json;
|
||||||
locker.EnterReadLock();
|
locker.EnterReadLock();
|
||||||
json = Json.Encode(dictionary);
|
json = JsonConvert.SerializeObject(dictionary);
|
||||||
locker.ExitReadLock();
|
locker.ExitReadLock();
|
||||||
using (var sw = new StreamWriter(filePath)) {
|
using (var sw = new StreamWriter(filePath)) {
|
||||||
return sw.WriteAsync(json);
|
return sw.WriteAsync(json);
|
||||||
|
@ -42,7 +43,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
var text = await sr.ReadToEndAsync();
|
var text = await sr.ReadToEndAsync();
|
||||||
Dictionary<string, object> result = null;
|
Dictionary<string, object> result = null;
|
||||||
try {
|
try {
|
||||||
result = Json.Parse(text) as Dictionary<string, object>;
|
result = JsonConvert.DeserializeObject<Dictionary<string, object>>(text, new LeanCloudJsonConverter());
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
AVClient.PrintLog(e.Message);
|
AVClient.PrintLog(e.Message);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Globalization;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using LeanCloud.Storage.Internal;
|
using LeanCloud.Storage.Internal;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud.Storage.Internal
|
namespace LeanCloud.Storage.Internal
|
||||||
{
|
{
|
||||||
|
@ -66,7 +67,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
|
|
||||||
saveTask = storageController
|
saveTask = storageController
|
||||||
.LoadAsync()
|
.LoadAsync()
|
||||||
.OnSuccess(t => t.Result.AddAsync("CurrentUser", Json.Encode(data)))
|
.OnSuccess(t => t.Result.AddAsync("CurrentUser", JsonConvert.SerializeObject(data)))
|
||||||
.Unwrap();
|
.Unwrap();
|
||||||
}
|
}
|
||||||
CurrentUser = user;
|
CurrentUser = user;
|
||||||
|
@ -96,7 +97,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
AVUser user = null;
|
AVUser user = null;
|
||||||
if (userDataString != null)
|
if (userDataString != null)
|
||||||
{
|
{
|
||||||
var userData = Json.Parse(userDataString) as IDictionary<string, object>;
|
var userData = JsonConvert.DeserializeObject<Dictionary<string, object>>(userDataString, new LeanCloudJsonConverter());
|
||||||
var state = AVObjectCoder.Instance.Decode(userData, AVDecoder.Instance);
|
var state = AVObjectCoder.Instance.Decode(userData, AVDecoder.Instance);
|
||||||
user = AVObject.FromState<AVUser>(state, "_User");
|
user = AVObject.FromState<AVUser>(state, "_User");
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = objectJSON
|
Content = objectJSON
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
serverState = serverState.MutatedClone(mutableClone =>
|
serverState = serverState.MutatedClone(mutableClone =>
|
||||||
|
@ -54,7 +54,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
serverState = serverState.MutatedClone(mutableClone =>
|
serverState = serverState.MutatedClone(mutableClone =>
|
||||||
|
@ -80,7 +80,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
{ "authData", authData}
|
{ "authData", authData}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
serverState = serverState.MutatedClone(mutableClone =>
|
serverState = serverState.MutatedClone(mutableClone =>
|
||||||
|
@ -97,7 +97,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Path = "users/me",
|
Path = "users/me",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
return AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
});
|
});
|
||||||
|
@ -112,7 +112,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
{ "email", email}
|
{ "email", email}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IObjectState> LogInWithParametersAsync(string relativeUrl, IDictionary<string, object> data,
|
public Task<IObjectState> LogInWithParametersAsync(string relativeUrl, IDictionary<string, object> data,
|
||||||
|
@ -123,7 +123,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
serverState = serverState.MutatedClone(mutableClone =>
|
serverState = serverState.MutatedClone(mutableClone =>
|
||||||
|
@ -144,7 +144,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
{ "new_password", newPassword },
|
{ "new_password", newPassword },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return commandRunner.RunCommandAsync(command, cancellationToken: cancellationToken);
|
return commandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<IObjectState> RefreshSessionTokenAsync(string userId, string sessionToken,
|
public Task<IObjectState> RefreshSessionTokenAsync(string userId, string sessionToken,
|
||||||
|
@ -154,7 +154,7 @@ namespace LeanCloud.Storage.Internal
|
||||||
Path = $"users/{userId}/refreshSessionToken",
|
Path = $"users/{userId}/refreshSessionToken",
|
||||||
Method = HttpMethod.Put
|
Method = HttpMethod.Put
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
var serverState = AVObjectCoder.Instance.Decode(t.Result.Item2, AVDecoder.Instance);
|
||||||
return serverState;
|
return serverState;
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace LeanCloud.Storage.Internal {
|
||||||
|
public class LeanCloudJsonConverter : JsonConverter {
|
||||||
|
public override bool CanConvert(Type objectType) {
|
||||||
|
return objectType == typeof(object);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
|
||||||
|
serializer.Serialize(writer, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
|
||||||
|
if (reader.TokenType == JsonToken.StartObject) {
|
||||||
|
var obj = new Dictionary<string, object>();
|
||||||
|
serializer.Populate(reader, obj);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
if (reader.TokenType == JsonToken.StartArray) {
|
||||||
|
var arr = new List<object>();
|
||||||
|
serializer.Populate(reader, arr);
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
|
|
||||||
|
return serializer.Deserialize(reader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud
|
namespace LeanCloud
|
||||||
{
|
{
|
||||||
|
@ -348,7 +349,7 @@ namespace LeanCloud
|
||||||
select string.Format("{0}={1}",
|
select string.Format("{0}={1}",
|
||||||
Uri.EscapeDataString(pair.Key),
|
Uri.EscapeDataString(pair.Key),
|
||||||
Uri.EscapeDataString(string.IsNullOrEmpty(valueString) ?
|
Uri.EscapeDataString(string.IsNullOrEmpty(valueString) ?
|
||||||
Json.Encode(pair.Value) : valueString)))
|
JsonConvert.SerializeObject(pair.Value) : valueString)))
|
||||||
.ToArray());
|
.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,12 +366,12 @@ namespace LeanCloud
|
||||||
|
|
||||||
internal static IDictionary<string, object> DeserializeJsonString(string jsonData)
|
internal static IDictionary<string, object> DeserializeJsonString(string jsonData)
|
||||||
{
|
{
|
||||||
return Json.Parse(jsonData) as IDictionary<string, object>;
|
return JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonData, new LeanCloudJsonConverter());
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static string SerializeJsonString(IDictionary<string, object> jsonData)
|
internal static string SerializeJsonString(IDictionary<string, object> jsonData)
|
||||||
{
|
{
|
||||||
return Json.Encode(jsonData);
|
return JsonConvert.SerializeObject(jsonData);
|
||||||
}
|
}
|
||||||
|
|
||||||
//public static Task<Tuple<HttpStatusCode, string>> HttpGetAsync(Uri uri)
|
//public static Task<Tuple<HttpStatusCode, string>> HttpGetAsync(Uri uri)
|
||||||
|
@ -419,10 +420,11 @@ namespace LeanCloud
|
||||||
IDictionary<string, object> strs = null;
|
IDictionary<string, object> strs = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
strs = (!item2.StartsWith("[", StringComparison.Ordinal) ? AVClient.DeserializeJsonString(item2) : new Dictionary<string, object>()
|
|
||||||
|
strs = !item2.StartsWith("[", StringComparison.Ordinal) ? AVClient.DeserializeJsonString(item2) : new Dictionary<string, object>()
|
||||||
{
|
{
|
||||||
{ "results", Json.Parse(item2) }
|
{ "results", JsonConvert.DeserializeObject<Dictionary<string, object>>(item2, new LeanCloudJsonConverter()) }
|
||||||
});
|
};
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception exception)
|
||||||
{
|
{
|
||||||
|
@ -440,13 +442,11 @@ namespace LeanCloud
|
||||||
|
|
||||||
internal static Task<Tuple<HttpStatusCode, IDictionary<string, object>>> RunCommandAsync(AVCommand command)
|
internal static Task<Tuple<HttpStatusCode, IDictionary<string, object>>> RunCommandAsync(AVCommand command)
|
||||||
{
|
{
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command);
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static bool IsSuccessStatusCode(HttpStatusCode responseStatus)
|
internal static bool IsSuccessStatusCode(HttpStatusCode responseStatus) {
|
||||||
{
|
return (responseStatus >= HttpStatusCode.OK) && (responseStatus <= HttpStatusCode.PartialContent);
|
||||||
var codeValue = (int)responseStatus;
|
|
||||||
return (codeValue > 199) && (codeValue < 204);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using LeanCloud.Storage.Internal;
|
using LeanCloud.Storage.Internal;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud {
|
namespace LeanCloud {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -129,7 +130,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -203,7 +204,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -233,7 +234,7 @@ namespace LeanCloud {
|
||||||
Content = body
|
Content = body
|
||||||
};
|
};
|
||||||
|
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -262,7 +263,7 @@ namespace LeanCloud {
|
||||||
var command = new AVCommand {
|
var command = new AVCommand {
|
||||||
Path = $"verifySmsCode/{code.Trim()}?mobilePhoneNumber={mobilePhoneNumber.Trim()}",
|
Path = $"verifySmsCode/{code.Trim()}?mobilePhoneNumber={mobilePhoneNumber.Trim()}",
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -309,7 +310,7 @@ namespace LeanCloud {
|
||||||
Path = $"requestCaptcha?width={width}&height={height}",
|
Path = $"requestCaptcha?width={width}&height={height}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
var decoded = AVDecoder.Instance.Decode(t.Result.Item2) as IDictionary<string, object>;
|
||||||
return new Captcha()
|
return new Captcha()
|
||||||
|
@ -338,7 +339,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
if (!t.Result.Item2.ContainsKey("validate_token"))
|
if (!t.Result.Item2.ContainsKey("validate_token"))
|
||||||
throw new KeyNotFoundException("validate_token");
|
throw new KeyNotFoundException("validate_token");
|
||||||
|
@ -357,7 +358,7 @@ namespace LeanCloud {
|
||||||
Path = $"statistics/apps/{AVClient.CurrentConfiguration.ApplicationId}/sendPolicy",
|
Path = $"statistics/apps/{AVClient.CurrentConfiguration.ApplicationId}/sendPolicy",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var settings = t.Result.Item2;
|
var settings = t.Result.Item2;
|
||||||
var CloudParameters = settings["parameters"] as IDictionary<string, object>;
|
var CloudParameters = settings["parameters"] as IDictionary<string, object>;
|
||||||
|
@ -390,7 +391,7 @@ namespace LeanCloud {
|
||||||
{ "session_token", user.SessionToken }
|
{ "session_token", user.SessionToken }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: cancellationToken).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
var body = t.Result.Item2;
|
var body = t.Result.Item2;
|
||||||
return new RealtimeSignature()
|
return new RealtimeSignature()
|
||||||
|
@ -471,8 +472,9 @@ namespace LeanCloud {
|
||||||
{
|
{
|
||||||
_encode = n =>
|
_encode = n =>
|
||||||
{
|
{
|
||||||
if (n != null)
|
if (n != null) {
|
||||||
return Json.Parse(n.ToString()) as IDictionary<string, object>;
|
return JsonConvert.DeserializeObject<Dictionary<string, object>>(n.ToString(), new LeanCloudJsonConverter());
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -369,7 +369,7 @@ namespace LeanCloud
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(cmd).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(cmd).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
var result = t.Result.Item2;
|
var result = t.Result.Item2;
|
||||||
this.state.ObjectId = result["objectId"].ToString();
|
this.state.ObjectId = result["objectId"].ToString();
|
||||||
|
|
|
@ -6,6 +6,7 @@ using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using LeanCloud.Storage.Internal;
|
using LeanCloud.Storage.Internal;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
namespace LeanCloud
|
namespace LeanCloud
|
||||||
{
|
{
|
||||||
|
@ -301,7 +302,7 @@ namespace LeanCloud
|
||||||
public static Task<IEnumerable<T>> DoCloudQueryAsync(string cqlTeamplate, params object[] pvalues)
|
public static Task<IEnumerable<T>> DoCloudQueryAsync(string cqlTeamplate, params object[] pvalues)
|
||||||
{
|
{
|
||||||
string queryStringTemplate = "cloudQuery?cql={0}&pvalues={1}";
|
string queryStringTemplate = "cloudQuery?cql={0}&pvalues={1}";
|
||||||
string pSrting = Json.Encode(pvalues);
|
string pSrting = JsonConvert.SerializeObject(pvalues);
|
||||||
string queryString = string.Format(queryStringTemplate, Uri.EscapeDataString(cqlTeamplate), Uri.EscapeDataString(pSrting));
|
string queryString = string.Format(queryStringTemplate, Uri.EscapeDataString(cqlTeamplate), Uri.EscapeDataString(pSrting));
|
||||||
|
|
||||||
return rebuildObjectFromCloudQueryResult(queryString);
|
return rebuildObjectFromCloudQueryResult(queryString);
|
||||||
|
@ -313,7 +314,7 @@ namespace LeanCloud
|
||||||
Path = queryString,
|
Path = queryString,
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command, cancellationToken: CancellationToken.None).OnSuccess(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command, cancellationToken: CancellationToken.None).OnSuccess(t =>
|
||||||
{
|
{
|
||||||
var items = t.Result.Item2["results"] as IList<object>;
|
var items = t.Result.Item2["results"] as IList<object>;
|
||||||
var className = t.Result.Item2["className"].ToString();
|
var className = t.Result.Item2["className"].ToString();
|
||||||
|
|
|
@ -71,7 +71,7 @@ namespace LeanCloud
|
||||||
Path = $"users/me?session_token={CurrentSessionToken}",
|
Path = $"users/me?session_token={CurrentSessionToken}",
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -301,7 +301,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -318,7 +318,7 @@ namespace LeanCloud
|
||||||
Path = $"users/{ObjectId}/friendship/{userObjectId}",
|
Path = $"users/{ObjectId}/friendship/{userObjectId}",
|
||||||
Method = HttpMethod.Delete
|
Method = HttpMethod.Delete
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1050,7 +1050,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1189,7 +1189,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1225,7 +1225,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Put,
|
Method = HttpMethod.Put,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1286,7 +1286,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1316,7 +1316,7 @@ namespace LeanCloud
|
||||||
Path = $"verifyMobilePhone/{code.Trim()}?mobilePhoneNumber={mobilePhoneNumber.Trim()}",
|
Path = $"verifyMobilePhone/{code.Trim()}?mobilePhoneNumber={mobilePhoneNumber.Trim()}",
|
||||||
Method = HttpMethod.Post
|
Method = HttpMethod.Post
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1333,7 +1333,7 @@ namespace LeanCloud
|
||||||
Path = $"verifyMobilePhone/{code.Trim()}",
|
Path = $"verifyMobilePhone/{code.Trim()}",
|
||||||
Method = HttpMethod.Post
|
Method = HttpMethod.Post
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
@ -1371,7 +1371,7 @@ namespace LeanCloud
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = strs
|
Content = strs
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).ContinueWith(t =>
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).ContinueWith(t =>
|
||||||
{
|
{
|
||||||
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
return AVClient.IsSuccessStatusCode(t.Result.Item1);
|
||||||
});
|
});
|
||||||
|
|
|
@ -157,7 +157,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
var leaderboard = Parse(t.Result.Item2);
|
var leaderboard = Parse(t.Result.Item2);
|
||||||
return leaderboard;
|
return leaderboard;
|
||||||
|
@ -219,7 +219,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Post,
|
Method = HttpMethod.Post,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
List<AVStatistic> statisticList = new List<AVStatistic>();
|
List<AVStatistic> statisticList = new List<AVStatistic>();
|
||||||
List<object> list = t.Result.Item2["results"] as List<object>;
|
List<object> list = t.Result.Item2["results"] as List<object>;
|
||||||
|
@ -253,7 +253,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Post
|
Method = HttpMethod.Post
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
List<AVStatistic> statisticList = new List<AVStatistic>();
|
List<AVStatistic> statisticList = new List<AVStatistic>();
|
||||||
List<object> list = t.Result.Item2["results"] as List<object>;
|
List<object> list = t.Result.Item2["results"] as List<object>;
|
||||||
|
@ -286,7 +286,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Delete,
|
Method = HttpMethod.Delete,
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command);
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -302,7 +302,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
List<AVLeaderboardArchive> archives = new List<AVLeaderboardArchive>();
|
List<AVLeaderboardArchive> archives = new List<AVLeaderboardArchive>();
|
||||||
List<object> list = t.Result.Item2["results"] as List<object>;
|
List<object> list = t.Result.Item2["results"] as List<object>;
|
||||||
foreach (object obj in list) {
|
foreach (object obj in list) {
|
||||||
|
@ -362,7 +362,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
List<AVRanking> rankingList = new List<AVRanking>();
|
List<AVRanking> rankingList = new List<AVRanking>();
|
||||||
List<object> list = t.Result.Item2["results"] as List<object>;
|
List<object> list = t.Result.Item2["results"] as List<object>;
|
||||||
|
@ -413,7 +413,7 @@ namespace LeanCloud {
|
||||||
Method = HttpMethod.Put,
|
Method = HttpMethod.Put,
|
||||||
Content = data
|
Content = data
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
return t.Result.Item2;
|
return t.Result.Item2;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -428,7 +428,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Get
|
Method = HttpMethod.Get
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
// 反序列化 Leaderboard 对象
|
// 反序列化 Leaderboard 对象
|
||||||
var leaderboard = Parse(t.Result.Item2);
|
var leaderboard = Parse(t.Result.Item2);
|
||||||
|
@ -449,7 +449,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Put
|
Method = HttpMethod.Put
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command).OnSuccess(t => {
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command).OnSuccess(t => {
|
||||||
try {
|
try {
|
||||||
Init(t.Result.Item2);
|
Init(t.Result.Item2);
|
||||||
return this;
|
return this;
|
||||||
|
@ -468,7 +468,7 @@ namespace LeanCloud {
|
||||||
Path = path,
|
Path = path,
|
||||||
Method = HttpMethod.Delete
|
Method = HttpMethod.Delete
|
||||||
};
|
};
|
||||||
return AVPlugins.Instance.CommandRunner.RunCommandAsync(command);
|
return AVPlugins.Instance.CommandRunner.RunCommandAsync<IDictionary<string, object>>(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
static AVLeaderboard Parse(IDictionary<string, object> data) {
|
static AVLeaderboard Parse(IDictionary<string, object> data) {
|
||||||
|
|
Loading…
Reference in New Issue