using System;
using Unosquare.Swan.Exceptions;
using Unosquare.Swan.Models;
using Unosquare.Swan.Formatters;
using System.Collections.Generic;
using System.Net.Http;
using System.Security;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Unosquare.Swan.Networking {
///
/// Represents a HttpClient with extended methods to use with JSON payloads
/// and bearer tokens authentication.
///
public static class JsonClient {
private const String JsonMimeType = "application/json";
///
/// Post a object as JSON with optional authorization token.
///
/// The type of response object.
/// The URL.
/// The payload.
/// The authorization.
/// The cancellation token.
/// A task with a result of the requested type.
public static async Task Post(
String url,
Object payload,
String authorization = null,
CancellationToken ct = default) {
String jsonString = await PostString(url, payload, authorization, ct).ConfigureAwait(false);
return !String.IsNullOrEmpty(jsonString) ? Json.Deserialize(jsonString) : default;
}
///
/// Posts a object as JSON with optional authorization token and retrieve an object
/// or an error.
///
/// The type of response object.
/// The type of the error.
/// The URL.
/// The payload.
/// The HTTP status error.
/// The authorization.
/// The cancellation token.
/// A task with a result of the requested type or an error object.
public static async Task> PostOrError(
String url,
Object payload,
Int32 httpStatusError = 500,
String authorization = null,
CancellationToken ct = default) {
using(HttpClient httpClient = GetHttpClientWithAuthorizationHeader(authorization)) {
StringContent payloadJson = new StringContent(Json.Serialize(payload), Encoding.UTF8, JsonMimeType);
HttpResponseMessage response = await httpClient.PostAsync(url, payloadJson, ct).ConfigureAwait(false);
String jsonString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
return response.StatusCode == System.Net.HttpStatusCode.OK
? OkOrError.FromOk(!String.IsNullOrEmpty(jsonString)
? Json.Deserialize(jsonString)
: default)
: (Int32)response.StatusCode == httpStatusError
? OkOrError.FromError(!String.IsNullOrEmpty(jsonString)
? Json.Deserialize(jsonString)
: default)
: new OkOrError();
}
}
///
/// Posts the specified URL.
///
/// The URL.
/// The payload.
/// The authorization.
/// The cancellation token.
/// A task with a result as a collection of key/value pairs.
public static async Task> Post(
String url,
Object payload,
String authorization = null,
CancellationToken ct = default) {
String jsonString = await PostString(url, payload, authorization, ct).ConfigureAwait(false);
return String.IsNullOrWhiteSpace(jsonString)
? default
: Json.Deserialize(jsonString) as IDictionary;
}
///
/// Posts the specified URL.
///
/// The URL.
/// The payload.
/// The authorization.
/// The cancellation token.
///
/// A task with a result of the requested string.
///
/// url.
/// Error POST JSON.
public static Task PostString(
String url,
Object payload,
String authorization = null,
CancellationToken ct = default) => SendAsync(HttpMethod.Post, url, payload, authorization, ct);
///
/// Puts the specified URL.
///
/// The type of response object.
/// The URL.
/// The payload.
/// The authorization.
/// The cancellation token.
/// A task with a result of the requested type.
public static async Task Put(
String url,
Object payload,
String authorization = null,
CancellationToken ct = default) {
String jsonString = await PutString(url, payload, authorization, ct).ConfigureAwait(false);
return !String.IsNullOrEmpty(jsonString) ? Json.Deserialize(jsonString) : default;
}
///
/// Puts the specified URL.
///
/// The URL.
/// The payload.
/// The authorization.
/// The cancellation token.
/// A task with a result of the requested collection of key/value pairs.
public static async Task> Put(
String url,
Object payload,
String authorization = null,
CancellationToken ct = default) {
Object response = await Put