- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
class SMSSender
{
const string API_URL = "http://api.sms****.ru/?";
string base_URL = "";
private string _email;
private string _password;
XmlDocument doc = new XmlDocument();
Dictionary<string,string> parameters;
public SMSSender(string email, string password)
{
_email = email;
_password = password;
base_URL = API_URL + "email=" + _email + "&password=" + _password + "&";
}
public bool LoginAttempt()
{
parameters = new Dictionary<string, string>();
parameters.Add("method", "login");
return APIRequest(parameters);
}
public KeyValuePair<int,object> GetCreditsLeft()
{
parameters = new Dictionary<string, string>();
parameters.Add("method", "get_profie");
APIRequest(parameters);
return new KeyValuePair<int, object>(0, int.Parse(GetValueByName("credits")));
}
public int SendSMS(string senderName, string internationalNumber, string text)
{
parameters = new Dictionary<string, string>();
parameters.Add("method", "push_msg");
parameters.Add("text", text);
parameters.Add("phone", internationalNumber);
parameters.Add("sender_name", senderName);
APIRequest(parameters);
return int.Parse(GetValueByName("n_raw_sms"));
}
public KeyValuePair<int, object> GetLastError()
{
return new KeyValuePair<int, object>(int.Parse(doc.GetElementsByTagName("err_code")[0].InnerText), doc.GetElementsByTagName("text")[0].InnerText);
}
private string GetValueByName(string keyToReturn)
{
return doc.GetElementsByTagName(keyToReturn)[0].InnerText;
}
private bool APIRequest(Dictionary<string, string> param)
{
string URL = base_URL;
foreach (KeyValuePair<string, string> p in param)
URL = URL + p.Key + "=" + p.Value + "&";
doc.Load(URL);
if (GetLastError().Key == 0) return true;
else throw new SMSSenderException(GetLastError().Key, GetLastError().Value.ToString());
}
}
class SMSSenderException : Exception
{
int _errorCode;
string _Message;
public SMSSenderException(int errorCode, string Message)
{
_errorCode = errorCode;
_Message = Message;
}
public int ErrorCode
{
get { return _errorCode; }
}
override public string Message
{
get { return _Message; }
}
}
}
API сервер отправки принимает запросы вида http://api.****sms.ru?method=send_msg&phone=+79 123456789&text=abcdef, возвращает простейший XML с err_code и результатом выполнения запроса.
Казалось бы, 20 строчек кода и проблема решена? Нифига, без специального класса для этого не обойтись. Совсем никак. И уж совсем ничего нельзя делать без специального Exception для этого дела.
anmiles 16.01.2012 14:23 # +3
akaDElpher 16.01.2012 14:32 # +3
* я про написание класса на каждый чих
depend86 16.01.2012 14:52 # +4
1) интерфейс выделил для этого класса - для unit тестирования например
2) вместо KeyValuePair<int,object> возвращал бы объект отдельного класс, который, в первой версии, тупо оборачивал бы KeyValuePair<int,object>
3) выделение отдельного Exception'а нужно для того, чтобы в том коде который будет использовать класс SMSSender ловить только это исключение и что-то с ним делать
akaDElpher 16.01.2012 15:02 # +1
const string API_URL = "http://api.sms****.ru/?";
(надо его с другого места брать)
uaavg 16.01.2012 18:05 # 0