Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Collections.Specialized;
- using System.Text;
- using System.Threading.Tasks;
- namespace SharpDig
- {
- /// <summary>
- /// Klasa tworząca żądanie dla WykopAPI
- /// </summary>
- public class Request<T>
- where T : class
- {
- private readonly List<string> _resparams = new List<string>();
- private readonly Dictionary<string, string> _apiparams = new Dictionary<string, string>();
- private NameValueCollection _postdata;
- private readonly ApiLayer _layer;
- private readonly string _resource;
- private readonly string _method;
- /// <summary>
- /// Tworzy instancję klasy
- /// </summary>
- private Request(ApiLayer layer, string res, string method)
- {
- _layer = layer;
- _resource = res;
- _method = method;
- }
- /// <summary>
- /// Tworzy żądanie
- /// </summary>
- /// <param name="layer">Referencja do obiektu reprezentującego aplikację</param>
- /// <param name="resource">Nazwa zasobu</param>
- /// <param name="method">Nazwa metody zasobu</param>
- /// <returns>Instancję utworzonego żądania</returns>
- public static Request<T> Create(ApiLayer layer, string resource, string method)
- {
- return new Request<T>(layer, resource, method);
- }
- /// <summary>
- /// Dodaje do żądania klucz sesji użytkownika
- /// </summary>
- /// <param name="session">Referencja do obiektu reprezentującego sesję użytkownika</param>
- /// <returns>Instancję obiektu, na którym działała metoda</returns>
- public Request<T> AddUserKey(Account session)
- {
- _apiparams.Add("userkey", session.UserKey);
- }
- /// <summary>
- /// Dodaje do żądania parametr zawierający klucz publiczny aplikacji
- /// </summary>
- /// <returns>Instancję obiektu, na którym działała metoda</returns>
- public Request<T> AddAppKey()
- {
- _apiparams.Add("appkey", _layer.AppKey);
- }
- /// <summary>
- /// Dodaje do żądania parametr zasobu
- /// </summary>
- /// <param name="param">Wartość parametru</param>
- /// <returns>Instancję obiektu, na którym działała metoda</returns>
- public Request<T> AddResParam(string param)
- {
- _resparams.Add(param);
- return this;
- }
- /// <summary>
- /// Dodaje do żądania parametr API
- /// </summary>
- /// <param name="key">Nazwa parametru</param>
- /// <param name="value">Wartość parametru</param>
- /// <returns>Instancję obiektu, na którym działała metoda</returns>
- public Request<T> AddApiParam(string key, string value)
- {
- if(key == "userkey" || key == "appkey")
- throw new ArgumentException(string.Format("Dodawanie '{0}' jako parametru jest zabronione.", key), "key");
- _apiparams.Add(key, value);
- return this;
- }
- /// <summary>
- /// Dodaje do żądania parametr, który jest przesyłany poprzez metodę POST
- /// </summary>
- /// <param name="key">Nazwa parametru</param>
- /// <param name="value">Wartość parametru</param>
- /// <returns>Instancję obiektu, na którym działała metoda</returns>
- public Request<T> AddPostParam(string key, string value)
- {
- if(_postdata == null)
- _postdata = new NameValueCollection();
- _postdata.Add(key, value);
- return this;
- }
- /// <summary>
- /// Tworzy ciąg reprezentujący żądanie
- /// </summary>
- /// <returns>Ciąg znaków reprezentujący żądanie</returns>
- private string BuildString()
- {
- var builder = new StringBuilder(string.Format("http://a.wykop.pl/{0}/{1}/", _resource, _method));
- foreach (var param in _resparams)
- {
- builder.Append(param);
- builder.Append('/');
- }
- foreach (var param in _apiparams)
- {
- builder.Append(param.Key);
- builder.Append(',');
- builder.Append(param.Value);
- }
- return builder.ToString();
- }
- /// <summary>
- /// Wykonuje żądanie
- /// </summary>
- /// <returns>Żądany obiekt podany jako T</returns>
- public T Do()
- {
- return _layer.DoCustomRequest<T>(BuildString(), _postdata);
- }
- /// <summary>
- /// Wykonuje żądanie asynchronicznie
- /// </summary>
- /// <returns>Żądany obiekt podany jako T</returns>
- public async Task<T> DoAsync()
- {
- return await _layer.DoCustomRequestAsync<T>(BuildString(), _postdata);
- }
- public static implicit operator T(Request<T> request)
- {
- return request.Do();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment