212 lines
6.2 KiB
C#
212 lines
6.2 KiB
C#
using RestSharp;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Net;
|
|
using System.Reflection;
|
|
|
|
namespace UptimeSharp
|
|
{
|
|
/// <summary>
|
|
/// UptimeClient
|
|
/// </summary>
|
|
public partial class UptimeClient
|
|
{
|
|
/// <summary>
|
|
/// REST client used for the API communication
|
|
/// </summary>
|
|
protected readonly RestClient _restClient;
|
|
|
|
/// <summary>
|
|
/// The base URL for the UptimeRobot API
|
|
/// </summary>
|
|
protected static Uri baseUri = new Uri("http://api.uptimerobot.com/");
|
|
|
|
/// <summary>
|
|
/// Accessor for the UptimeRebot API key
|
|
/// see: http://http://www.uptimerobot.com/api.asp
|
|
/// </summary>
|
|
public string ApiKey { get; set; }
|
|
|
|
/// <summary>
|
|
/// Returns all associated data from the last request
|
|
/// </summary>
|
|
public IRestResponse LastRequestData { get; private set; }
|
|
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="UptimeClient"/> class.
|
|
/// </summary>
|
|
/// <param name="apiKey">The API key</param>
|
|
public UptimeClient(string apiKey)
|
|
{
|
|
// assign public properties
|
|
ApiKey = apiKey;
|
|
|
|
// initialize REST client
|
|
_restClient = new RestClient(baseUri.ToString());
|
|
|
|
// add default parameters to each request
|
|
_restClient.AddDefaultParameter("apiKey", ApiKey);
|
|
|
|
// defines the response format (according to the UptimeRobot docs)
|
|
_restClient.AddDefaultParameter("format", "json");
|
|
|
|
// UptimeRobot returns by default JSON-P when json-formatting is set
|
|
// with this param it can return raw JSON
|
|
_restClient.AddDefaultParameter("noJsonCallback", "1");
|
|
|
|
// custom JSON deserializer (ServiceStack.Text)
|
|
_restClient.AddHandler("application/json", new JsonDeserializer());
|
|
|
|
// add custom deserialization lambdas
|
|
JsonDeserializer.AddCustomDeserialization();
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Makes a typed HTTP REST request to the API
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="request">The request.</param>
|
|
/// <returns></returns>
|
|
protected T Request<T>(RestRequest request) where T : new()
|
|
{
|
|
// fix content type if wrong determined by RestSharp
|
|
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };
|
|
|
|
IRestResponse<T> response = _restClient.Execute<T>(request);
|
|
|
|
LastRequestData = response;
|
|
ValidateResponse<T>(response);
|
|
|
|
return response.Data;
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Fetches a typed resource
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="resource">Requested resource</param>
|
|
/// <param name="parameters">Additional GET parameters</param>
|
|
/// <returns></returns>
|
|
protected T Get<T>(string resource, List<Parameter> parameters = null) where T : class, new()
|
|
{
|
|
// UptimeRobot uses GET for all of its endpoints
|
|
var request = new RestRequest(resource, Method.GET);
|
|
|
|
// enumeration for params
|
|
if (parameters != null)
|
|
{
|
|
parameters.ForEach(
|
|
param => {
|
|
if(param.Value != null)
|
|
{
|
|
request.AddParameter(param);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
// do the request
|
|
return Request<T>(request);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Fetches a typed resource
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
/// <param name="resource">Requested resource</param>
|
|
/// <param name="parameter">The parameters.</param>
|
|
/// <returns></returns>
|
|
protected T Get<T>(string resource, params Parameter[] parameters) where T : class, new()
|
|
{
|
|
List<Parameter> parameterList = new List<Parameter>();
|
|
parameterList.AddRange(parameters);
|
|
|
|
return Get<T>(resource, parameterList);
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Creates a RestSharp.Parameter instance.
|
|
/// </summary>
|
|
/// <param name="name">The name.</param>
|
|
/// <param name="value">The value.</param>
|
|
/// <returns></returns>
|
|
internal static Parameter Parameter(string name, object value)
|
|
{
|
|
return new Parameter()
|
|
{
|
|
Name = name,
|
|
Value = value,
|
|
Type = ParameterType.GetOrPost
|
|
};
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// Validates the response.
|
|
/// </summary>
|
|
/// <param name="response">The response.</param>
|
|
/// <returns></returns>
|
|
/// <exception cref="UptimeSharpException">
|
|
/// Error retrieving response
|
|
/// </exception>
|
|
protected void ValidateResponse<T>(IRestResponse<T> response) where T : new()
|
|
{
|
|
Type responseType = response.Data.GetType();
|
|
|
|
// get status property from ResponseBase POCO
|
|
PropertyInfo statusProp = responseType.GetProperty("Status");
|
|
object status = statusProp.GetValue(response.Data, null);
|
|
|
|
// Error from UptimeSharp
|
|
if (status.Equals(false))
|
|
{
|
|
// get error properties from response
|
|
PropertyInfo errorProp = responseType.GetProperty("ErrorMessage");
|
|
object error = errorProp.GetValue(response.Data, null);
|
|
|
|
PropertyInfo errorCodeProp = responseType.GetProperty("ErrorCode");
|
|
object errorCode = errorCodeProp.GetValue(response.Data, null);
|
|
|
|
// create exception
|
|
UptimeSharpException exception = new UptimeSharpException(
|
|
"UptimeRobot Exception: {0} (Code: {1})\n{2}",
|
|
response.ErrorException,
|
|
error,
|
|
errorCode,
|
|
"http://uptimerobot.com/api.asp#errorMessages"
|
|
);
|
|
|
|
// add custom pocket fields
|
|
exception.Error = error.ToString();
|
|
exception.ErrorCode = Convert.ToInt32(errorCode);
|
|
|
|
// add to generic exception data
|
|
exception.Data.Add("Error", error);
|
|
exception.Data.Add("ErrorCode", errorCode);
|
|
|
|
throw exception;
|
|
}
|
|
// HTTP Request Error
|
|
else if (response.StatusCode != HttpStatusCode.OK)
|
|
{
|
|
throw new UptimeSharpException(
|
|
"Request Exception: {0} (Code: {1})",
|
|
response.ErrorException,
|
|
response.ErrorMessage,
|
|
response.StatusCode
|
|
);
|
|
}
|
|
// Exception by RestSharp
|
|
else if (response.ErrorException != null)
|
|
{
|
|
throw new UptimeSharpException("Error retrieving response", response.ErrorException);
|
|
}
|
|
}
|
|
}
|
|
}
|