Guest User

sharpdig #3

a guest
Aug 9th, 2013
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.10 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.Specialized;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace SharpDig
  8. {
  9.     /// <summary>
  10.     /// Klasa tworząca żądanie dla WykopAPI
  11.     /// </summary>
  12.     public class Request<T>
  13.         where T : class
  14.     {
  15.         private readonly List<string> _resparams = new List<string>();
  16.         private readonly Dictionary<string, string> _apiparams = new Dictionary<string, string>();
  17.         private NameValueCollection _postdata;
  18.  
  19.         private readonly ApiLayer _layer;
  20.         private readonly string _resource;
  21.         private readonly string _method;
  22.  
  23.         /// <summary>
  24.         /// Tworzy instancję klasy
  25.         /// </summary>
  26.         private Request(ApiLayer layer, string res, string method)
  27.         {
  28.             _layer = layer;
  29.             _resource = res;
  30.             _method = method;
  31.         }
  32.  
  33.         /// <summary>
  34.         /// Tworzy żądanie
  35.         /// </summary>
  36.         /// <param name="layer">Referencja do obiektu reprezentującego aplikację</param>
  37.         /// <param name="resource">Nazwa zasobu</param>
  38.         /// <param name="method">Nazwa metody zasobu</param>
  39.         /// <returns>Instancję utworzonego żądania</returns>
  40.         public static Request<T> Create(ApiLayer layer, string resource, string method)
  41.         {
  42.             return new Request<T>(layer, resource, method);
  43.         }
  44.  
  45.         /// <summary>
  46.         /// Dodaje do żądania klucz sesji użytkownika
  47.         /// </summary>
  48.         /// <param name="session">Referencja do obiektu reprezentującego sesję użytkownika</param>
  49.         /// <returns>Instancję obiektu, na którym działała metoda</returns>
  50.         public Request<T> AddUserKey(Account session)
  51.         {
  52.             _apiparams.Add("userkey", session.UserKey);
  53.         }
  54.  
  55.         /// <summary>
  56.         /// Dodaje do żądania parametr zawierający klucz publiczny aplikacji
  57.         /// </summary>
  58.         /// <returns>Instancję obiektu, na którym działała metoda</returns>
  59.         public Request<T> AddAppKey()
  60.         {
  61.             _apiparams.Add("appkey", _layer.AppKey);
  62.         }
  63.  
  64.         /// <summary>
  65.         /// Dodaje do żądania parametr zasobu
  66.         /// </summary>
  67.         /// <param name="param">Wartość parametru</param>
  68.         /// <returns>Instancję obiektu, na którym działała metoda</returns>
  69.         public Request<T> AddResParam(string param)
  70.         {
  71.             _resparams.Add(param);
  72.             return this;
  73.         }
  74.  
  75.         /// <summary>
  76.         /// Dodaje do żądania parametr API
  77.         /// </summary>
  78.         /// <param name="key">Nazwa parametru</param>
  79.         /// <param name="value">Wartość parametru</param>
  80.         /// <returns>Instancję obiektu, na którym działała metoda</returns>
  81.         public Request<T> AddApiParam(string key, string value)
  82.         {
  83.             if(key == "userkey" || key == "appkey")
  84.                 throw new ArgumentException(string.Format("Dodawanie '{0}' jako parametru jest zabronione.", key), "key");
  85.             _apiparams.Add(key, value);
  86.             return this;
  87.         }
  88.  
  89.         /// <summary>
  90.         /// Dodaje do żądania parametr, który jest przesyłany poprzez metodę POST
  91.         /// </summary>
  92.         /// <param name="key">Nazwa parametru</param>
  93.         /// <param name="value">Wartość parametru</param>
  94.         /// <returns>Instancję obiektu, na którym działała metoda</returns>
  95.         public Request<T> AddPostParam(string key, string value)
  96.         {
  97.             if(_postdata == null)
  98.                 _postdata = new NameValueCollection();
  99.             _postdata.Add(key, value);
  100.             return this;
  101.         }
  102.  
  103.         /// <summary>
  104.         /// Tworzy ciąg reprezentujący żądanie
  105.         /// </summary>
  106.         /// <returns>Ciąg znaków reprezentujący żądanie</returns>
  107.         private string BuildString()
  108.         {
  109.             var builder = new StringBuilder(string.Format("http://a.wykop.pl/{0}/{1}/", _resource, _method));
  110.             foreach (var param in _resparams)
  111.             {
  112.                 builder.Append(param);
  113.                 builder.Append('/');
  114.             }
  115.             foreach (var param in _apiparams)
  116.             {
  117.                 builder.Append(param.Key);
  118.                 builder.Append(',');
  119.                 builder.Append(param.Value);
  120.             }
  121.             return builder.ToString();
  122.         }
  123.  
  124.         /// <summary>
  125.         /// Wykonuje żądanie
  126.         /// </summary>
  127.         /// <returns>Żądany obiekt podany jako T</returns>
  128.         public T Do()
  129.         {
  130.             return _layer.DoCustomRequest<T>(BuildString(), _postdata);
  131.         }
  132.         /// <summary>
  133.         /// Wykonuje żądanie asynchronicznie
  134.         /// </summary>
  135.         /// <returns>Żądany obiekt podany jako T</returns>
  136.         public async Task<T> DoAsync()
  137.         {
  138.             return await _layer.DoCustomRequestAsync<T>(BuildString(), _postdata);
  139.         }
  140.         public static implicit operator T(Request<T> request)
  141.         {
  142.             return request.Do();
  143.         }
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment