Статьи

Потерять REST из-за ошибок Ajax?

Слишком часто я вижу примеры Ajax, где ответ обрабатывается следующим образом: (псевдокод, используемый для демонстрационных целей)


xhr.onreadystatechange = function() 
{
  if ( xhr.readyState == 4 )
  {
    if (xhr.status == 200) 
    {
      // Process returned data (eg: Parse XML).
      
      // Check status of result depending on custom/ad-hoc error detection.
      //  -- most commonly a 0 for fail, or 1 for pass
      
      // Deal with/report error, or take some other action based upon returned data.
    }
  }
}

Вышеупомянутый подход работает, но по мере роста вашего приложения и увеличения потребности в предоставлении полезных отчетов об ошибках (и предотвращении ошибок!) Хорошая проверка ошибок в логическом стиле быстро станет громоздкой. Я вижу это сейчас…

  1. Разработчик 1 : Что означает код ошибки 7 снова?
  2. Разработчик 2 : Хм, подожди, я уверен, что мы где-то записали это …

Не бойтесь, есть гораздо более умная альтернатива, на которую вы полагаетесь каждый раз, когда загружаете свой браузер — коды состояния HTTP (посмотрите на юмористический сокращенный список Марка Пилигрима, если мысль о прочтении еще одного RFC вводит вас в тупик с остекленевшими глазами) ,

Взяв предыдущий пример, я добавил блок switch

 
xhr.onreadystatechange = function() 
{
  if ( xhr.readyState == 4 )
  {
    switch ( xhr.status )
    {
      case 200: // OK!
        /* 
         * If the request was to create a new resource 
         * (such as post an item to the database)
         * You could instead return a status code of '201 Created'
         */  
      break;
      
      case 304: // Not Modified
        /* 
         * This would be used when your Ajax widget is 
         * checking for updated content,
         * such as the Twitter interface.
         */   
      break;
      
      case 400: // Bad Request  
        /* 
         * A bit like a safety net for requests by your JS interface
         * that aren't supported on the server.
         * "Your browser made a request that the server cannot understand"
         */
      break;
      
      case 409: // Conflict 
        /* 
         * Perhaps your JavaScript request attempted to 
         * update a Database record 
         * but failed due to a conflict 
         * (eg: a field that must be unique)
         */
      break;
      
      case 503: // Service Unavailable
        /* 
         * A resource that this request relies upon
         * is currently unavailable 
         * (eg: a file is locked by another process)
         */
      break;    
    }
  }
}

Поэтому в следующий раз, когда вы собираетесь вставить <status>1</status> Это может быть первым шагом к получению некоторого ОТДЫХА , который, безусловно, является хорошей вещью ™.