Показаны сообщения с ярлыком C#. Показать все сообщения
Показаны сообщения с ярлыком C#. Показать все сообщения

понедельник, 17 февраля 2014 г.

Как я ASP.Net с JustClick подружил.

 Введение

Что такое JustClick?

"херня забагованая" (с) тим-лид
JustClick - Это такая платформа для инфобизнесменов,  соль в том что там всё автоматизировано, повсюду цветастые кнопки на которых написано "сделать красиво".

Но к сожалению не всё так радужно. И вот мы - кучка программистов уже делаем свою SaaS, с шахматами и балеринами, но для начало нам нужно было плавно переводить все ресурсы. После того как была написана основа мы приступили к интеграции, а именно к покупки товаров. Соль в том что бы при покупки в JustClick, товар был бы доступен и в личном кабинете на нашей платформе, собственно кусок из моих похождений я постараюсь описать в данной записи.

Это не мы такие, это реквест такой

Мне очень понравилось что в JustClick было API и мне очень не понравилось какое у них API. Самый логичное решение сделать обмен через скажем JSON или хотя бы XML. Но нет, ребята решили что PHP у всех и нужно пользоваться чем-то сильно зависимым от подобных языков.

Но нам ли жаловаться. 

Для начала нужно проделать такой финт конём (сразу скажу что с Asp.Net слабо знаком так-что быдлокодер костылём велосипед подгоняет) 
-Берём и копируем отседова секретный ключ подписи "Мой магазин" - "Магазин" - "Настройки" - "RussianPostService и API" 
-Создаём новую веб форму.
-Идём в товар, ставим в настройках API в графе оповещения ссылку на нашу форму.
-В форме ловим пост запрос который выглядит так в PHP и отправляется через urlencode(!):
 
array(
'id' => номер заказа
'first_name' => имя клиента
'last_name' => фамилия клиента
'middle_name' => отчество клиента
'email' => мейл клиента
'phone' => телефон клиента
'city' => город доставки
'country' => страна доставки
'address' => адрес доставки
'region' => регион доставки
'postalcode' => почтовый индекс
'created' => время создания заказа
'paid' => время оплаты заказа
'items' => array( массив товаров
array(
'id' => символьный идентификатор
'title' => название товара
'sum' => стоимость товара
),
array(
'id' => символьный идентификатор
'title' => название товара
'sum' => стоимость товара
),
...
)
'hash' => md5(номер заказа + мейл клиента + дата оплаты + секретный ключ)
)

 
До нас доходит примерно следующее

 id=3224966&first_name=asf&
last_name=&middle_name=&email=*******&phone=&city=&country=RUS&address=sdf&region=&postalcode=&created=1392641297&paid=1392641312&items[0][id]=ebook&items[0][title]=??????????? ?????&items[0][sum]=500.00&items[1][id]=0&hash=*********&


ASP.net своими силами пытается разбросать это всё по коллекции типа NameValueCollection
и скажу даже больше, у него это получается! Ну как получается....
Допустим мы можем взять из Request все не вложенные элементы.

 
 
Requeste["id"]; //norm
Requeste["email"]; //norm
Requeste["items"]; //EMPTY!!!

А фишка в том, что все вложенные элементы не парсятся до ещё одного набор коллекций. Нет. Оно превращается в ключи... Выгляди это примерно так:

 
Requeste["items[0][sum"]; //norm
Requeste["items[2][sum"]; //norm

Работать как все понимают с этим трудно, и даже слегка больно.

Заключение

Все пидорасы один я дартаньян (c)

Либо я не секу фишку, либо ребятам из JustClick стоило сделать лучше. Но в любом случае надеюсь эта заметка кому нибудь пригодится. 

воскресенье, 3 ноября 2013 г.

Парсинг сайтов на C#.

Для одного из своих приложений мне понадобилось достаточно много информации которой полно на различных wiki но всё это собирать вручную достаточно геморно. По этому я решил вооружится C# и распарсить всё что мне надо.  Мы будем использовать хорошую библиотеку Html Agility Pack которая берёт на себя большую часть работы и предоставляет для нас удобное DOM дерево с которым мы можем работать. Она поддерживает XPath запросы, LINQ и много всего вкусного.

воскресенье, 27 октября 2013 г.

Механизм исключений C#.

Не преодолев желания налабать что нибудь в блог, решил написать не большую статейку об исключениях в C#. Я не буду писать много воды и перейду сразу к делу. Логически я разделю статью на две части, обработка и выброс исключений. Собственно больше о них сказать мне не чего.


Не много об исключениях

Для начала определимся что такое исключения, и для чего они вообще нам нужны. На сколько мне известно, в достаточно старых языках таких как Си, для контроля за работай программы использовали примитивные способы, на подобие возврата кода ошибки из функции. Удобного в этом мало, да и попросту забыть проконтролировать код ошибки очень просто из-за чего может начаться не контролируемое поведения программы и бессонная ночь отловки бага :) Конечно в Си с помощью макросов и прочего есть не что подобное. Но в более поздних языках это представлено более лаконично. И так, смоделируем ситуацию, допустим у нас есть некий метод  который принимает пользовательский объект для последующей работы с ним. А теперь представим что мы в эту функции передали выражение со значением null. Что будет? Если метод попробует начать работу с пустышкой, система выбросит NullReferenceException, но по хорошему метод перед работай проверить правильность всех аргументов и сам выбросить нужные исключения. Выброшенная ошибка будет распространятся вверх по цепочки вызовов пока её не отловят или она не достигнет верхней точки и программа не завершится аварийно. Думаю теперь понятно зачем нужен механизм исключений?

Отлов исключений  
Для отлова исключений в C# предусмотрено три ключевых слова, все они относятся к одной системе и работает на подобии оператора if-else. Это try\catch\finaly. В тело оператора try помещается код, за которым нужно будет так сказать проследить. Catch блок обработки определённого исключения а finaly блок который будет вызван после обработки исключения для того что бы освободить ресурсы. Но по меньше лирики перейдём к коду :


....
try
{
    SomeObject _so;
    _so.SomeMethod();
}
catch(NullReferenceExcepetion e)
{
     //Обработка NullReferenceExeption
}
catch(Exception e)
{
    //Обработка вообще всех исключений
}
finaly
{
   //Блок который вызовется после обработки исключения
   // (если исчклюения не было блок не вызовется)
}
....
    
Из комментариев думаю всё ясно. Так же если вызвать некий метод в блоке try, то обработка исключения выполнится. Так же я бы хотел рассказать не много об особенности работы оператора catch. Как вы уже заметили в скобках нужно указывать класс исключения, да-да, все исключения это просто классы унаследованные от класса Exception. И все кто понимает механизм полиморфизма и ковариантности, догадаются что если объявить блок catch отлавливающий исключения Exepetion то он будет срабатывать на ВСЕ ошибки. Но, если мы хотим знать что мы именно поймали, стоит сверху от отловки Exception ловить более узкоспециализированные исключения. Так же из всех операторов catch выбирается один, тот который первый подошел. Так что не стоит указывать выше всех отлов Excepetion так как всё что ниже просто будет игнорироваться.

"Выброс" своих исключений

Для инициирования своих исключений в C# предусмотрен оператор throw. Справа от оператора указывается выражения которое имеет тип производный от System.Exception.
Проще говоря нужно указать ссылку на класс который пронаследован от System.Exception. Так же в .Net Framework пред усмотрена куча классов для этих дел, но при желание вы можете создать свои.  В общем синтаксис примерно такой:

public class ThrowTest2

 {
   static int GetNumber(int index)
   {
      int[] nums = { 300, 600, 900 };
      if(index > nums.Length)
      {
          throw new IndexOutOfRangeException();
      }
     return nums[index];
   }
   static void Main()
   {
      int result = GetNumber(3);
   }
 

Резюмируя

В заключения хочу сказать что можно найти ещё кучу всего интересного об исключениях в C#, я же взялся рассказать базовые возможности. Свои замечания пишите в комментариях, постараюсь поправить статью если что не так :)