Плохая ли практика иметь ajax, который возвращает JSON или HTML в зависимости от его успеха?

#jquery #ajax

#jquery #ajax

Вопрос:

У меня есть функция jQuery ajax, которая отвечает HTML при сбое вызова. Если вызов успешен, он отвечает JSON: {"result":true}

     $.ajax({
        type: 'POST',
        dataType: 'html',
        success: function (response) {
            if (response.RESULT === true) {
                window.location.replace(baseUrl);
            } // else do something else and show errors
        }
    });
  

Однако Firefox не распознает результат в формате JSON, поскольку для типа данных установлено значение ‘html’. Я попытался оставить его пустым, и это не сработало. Есть ли обходной путь, или это плохая практика возвращать две вещи?

Это для регистрационной формы. Я возвращаю HTML, потому что так проще показывать ошибки проверки пользователя (на стороне сервера), в то время как в случае успешной регистрации я перенаправляю их.

Ответ №1:

Я думаю, что вызов AJAX всегда должен возвращать данные в том же формате. Не рекомендуется возвращать HTML только в случае сбоя вызова. Вы всегда можете вернуть ответ JSON с параметром состояния, который может быть успешным или ошибкой, и параметром содержимого, который является ответом HTML.

Ответ №2:

Это плохая практика, возвращающая два разных формата данных. Потребители сервиса не будут знать, чего ожидать, и также плохой практикой является изменение формата в соответствующей группе сервисов (хотя некоторые исключительные сценарии оправдывают это)

В вашем случае :

Вместо этого вы можете постоянно возвращать JSON, а в случае ошибок возвращать JSON в этом формате :

 {
   "errorsHtml" : "<div class='errors'>...</div>"
}
  

И вы также можете использовать заголовки кода состояния HTTP для обозначения состояния сервера, например, статус 500 — внутренняя ошибка сервера. Вы можете обрабатывать различные коды состояния следующим образом :

  $.ajax({
  statusCode: {
    404: function() {
      alert('page not found');
    }
  }
});
  

Ответ №3:

Это плохая практика, хотя и не конец света. Я бы предпочел назвать это «взломом». Статус запроса должен основываться на коде ответа (200 — OK, ошибка содержимого 40x, ошибка сервера 50x).

Ответ №4:

Хорошей практикой является возврат запрошенного типа данных. Это так просто. Непоследовательная отправка данных может работать в краткосрочной перспективе, но в конечном итоге вы столкнетесь с долгосрочными проблемами с ремонтопригодностью, когда забудете, почему вы решили вернуть JSON в одной ситуации и HTML в другой.

Существует много способов запроса данных, мой личный фаворит — реализация запроса RESTful. Существует много способов реализации RESTful-системы.

Если вы собираетесь отправить запрос www.example.com/cars , вы, вероятно, получите список автомобилей, но у сервера нет хорошего способа узнать, как вы хотите, чтобы этот список автомобилей был отформатирован.

Простой способ указать, что вы хотите, — добавить суффикс: www.example.com/cars?type=HTML может быть достаточно описательным, чтобы уведомить сервер, какой тип данных вы хотите…

Разве не было бы удобно, если бы был способ указать, какой тип данных вы ожидаете получить обратно с сервера, не загрязняя строку запроса?

Оказывается, есть способ…расширения файлов: www.example.com/cars.html очень специфично для того, какой тип данных должен быть возвращен, и вы не будете смущены через 6 месяцев, когда вам нужно будет отследить эту ошибку, потому что вы будете знать, что запрос на стороне клиента ожидает HTML.

www.example.com/cars.js или www.example.com/cars.json может возвращать данные другого типа, и вы никогда не будете смущены тем, что запрос должен возвращать клиенту.

Лучшая часть использования RESTful-реализации заключается в том, что вы можете выдавать ошибки вашего запроса в виде кодов состояния HTTP. Неверно сформированный запрос? отправьте 400 сообщение об ошибке. Неправильные разрешения? отправьте 403 .

Привяжите обработчик ошибок к AJAX-запросу, и вы сможете легко отличить возвращаемый JSON «success» от JSON «error».

Если вам действительно нужен HTML, когда ожидается JSON, просто JSON кодирует его в объекте как {"error":"your html <strong>here</strong>"}

Ответ №5:

Не указывайте тип данных —
если не указан ни один, jQuery попытается вывести его на основе MIME-типа ответа

Указать несколько значений нормально и разрешено —
несколько значений, разделенных пробелами: начиная с jQuery 1.5, jQuery может преобразовать тип данных из того, что он получил в заголовке Content-Type, в то, что вам требуется. Например, если вы хотите, чтобы текстовый ответ обрабатывался как XML, используйте «text xml» для типа данных.

 $.ajax({
    type: 'POST'
    dataType: 'html json',
    success: function (response) {
        if (response.RESULT === true) {
            window.location.replace(baseUrl);
        } // else do something else and show errors
    }
});
  

http://api.jquery.com/jQuery.ajax / — ознакомьтесь с описанием типа данных.

Комментарии:

1. Это не означает, что сервер может возвращать все, что захочет — в вашем случае возвращаемые данные всегда преобразуются в JSON, даже если они в HTML, и не будут работать, когда сервер фактически возвращает HTML в одном случае и json в другом случае

2. конечно, это не означает, что сервер может возвращать что угодно, но все равно нормально.

3. Вы отредактировали свой ответ и сказали jquery преобразовать json в html, другими словами, даже если тип содержимого text / html, jquery будет обрабатывать его как данные json. Хорошо, теперь, что происходит, когда сервер возвращает json, а клиентская сторона также хочет json для вызова? Однако спасибо, что поделились этим, я не знал, что такая функция существует в jquery