Для кода состояния HTTP у меня есть что сказать

Java

Сейчас многие проекты являются веб-проектами, до и после окончания разделения взаимодействие происходит только через спокойный интерфейс, и когда мы вернулись из запроса, код состояния, как его вернуть?

Прежде всего, каковы обычно используемые коды состояния http.

2XX (Код успешного завершения)

200 - OK

запрос выполнен

201 - Created

Документ успешно создан,Например, успешное добавление пользователя

202 - Accepted

Запрос принят, соответствующая операция может быть не выполнена. Это используется для фоновой работы,Асинхронные операции, такие как сжатие базы данных

4XX (Код ошибки клиента)

400 - Bad Request

Неверные параметры запроса (Например, вы должны передать параметр типа Number, но вы передаете строку), запрос не может быть понят сервером, и запрос может быть повторно отправлен после модификации

401 - Unauthorized

Текущий запрашивающий пользователь не авторизован,например не залогинился

403 - Forbidden

Текущий запрос отклонен.Например, проблема с правами доступа к файловой системе или несанкционированные операции (например, обычные пользователи пытаются получить список пользователей-администраторов)

404 - Not Found

Запрошенный ресурс не найден,Обычно URL неправильный

405 - Method Not Allowed

Запрошенный URL-адрес был запрошен с недопустимым типом HTTP-запроса.Например, только сообщение поддержки API, в то время как клиент использовал get

406 - Not Acceptable

Сервер не поддерживает запрошенный тип контента

413 - Request Entity Too Large

Тело запроса слишком велико для поддержки.Обычно это вызвано тем, что загруженный файл превышает лимит.

5XX (Server Error код состояния ошибки сервера)

500 - Internal Server Error

Указывает, что при выполнении запроса на сервере произошла ошибка.Возможно, ошибка на сервере или в приложении.

503 - Service Unavailable

Услуга недоступна и не может обработать запрос прямо сейчас.

какой код ошибки возвращается

Как правило, в restful API мы идентифицируем код состояния следующим образом:

1. 2xx: сервер получает запрос клиента и может выполнить
2. 4xx: Ошибка в данных, отправленных клиентом, и сервер не может их выполнить (клиент может отправить другой запрос после исправления ошибки)
3. 5xx: данные, отправленные клиентом, верны, но серверная сторона не может выполниться из-за ошибки (клиентская сторона не может предпринять никаких действий)

ноЯ также видел, как STATUS CODE возвращает 200, а затем сообщает пользователю запросить успех с помощью пользовательского кода в ответе.

{
  "code": 10020,
  "msg": "name不能为空"
}

Хотя у редиски и овощей есть свои предпочтения, лично я все же считаю, что для интерфейса REST статус на уровне HTTP должен использоваться для выражения успешности операции., Поскольку сетевое взаимодействие — это не только клиент и сервер, в середине будет много уровней узлов, если один из уровней имеет очень ортодоксальное понимание запроса статуса 200 и выполняет кэширование или другую обработку, тогда вы можете сидеть на воске. А так как это написание интерфейса, то лучше быть стандартным и не зарываться.

Так что для успешного запроса нужно вернуть 2ХХ, а для интерфейса 4ХХ можно сделать соответствующую инкапсуляцию

返回数据
возвращаемые данные

Код состояния должен возвращать 4XX, но вы можете вернуть код ошибки исключения в данных ответа (этот код ошибки является кодом ошибки бизнес-ошибки).В настоящее время вы можете согласовать с внешним интерфейсом, что означает этот код бизнес-ошибки , и вы можете дать пользователю соответствующую подсказку.

Формат возвращаемых данных

public class BaseResponse<T> {

    // 业务异常码
    private int code;

    // 说明信息
    private String msg;

    // 需要封装返回的数据
    private T data;
}

НапримерGET /api/users/1, данные, возвращаемые таким запросом, помещаются в поле данных.

{
  "code":200,
  "msg":"SUCCESS",
  "data": {
    "id":1095,
    "name":"张三"
  }
}

Для ошибок сбоя запроса (код состояния http 4XX) будут возвращены следующие данные

{
  "code": 10030,
  "msg": "id不存在"
}

Поддержка Spring для кода состояния Http

@ResponseStatus(HttpStatus.CREATED)
public BaseResponse addUser(UserParam userParam) {

    return service.addUser(userParam);
}

непосредственно черезResponseStatusАннотация для указания возвращаемого кода ошибки. Конечно, это нормальная ситуация, как поступить в ситуации, когда параметр не проходит проверку или вызван другими бизнес-исключениями?

Есть два способа, первый - это класс ответственности в весеннее

public ResponseEntity<BaseResponse> addUser(UserParam userParam) {

  if(validate(userParam)) {
      return service.addUser(userParam);
  }

  return  new ResponseEntity<>(ResponseUtil.fail(STATUS_INVALID_PARAM), HttpStatus.NOT_FOUND);
}

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

@RestControllerAdvice
public class WebExceptionConfig {

  @ExceptionHandler(InvalidParamException.class)
  @ResponseStatus(HttpStatus.BAD_REQUEST)
  public BaseResponse handleInvalidParamException(InvalidParamException e) {
      return ResponseUtil.fail(STATUS_INVALID_PARAM, e.getMessage());
  }
}

Суммировать

  1. В разных ситуациях возвращаются разные коды состояния. В случае неудачных запросов возвращайте 4XX, а код бизнес-исключения можно указать в возвращаемых данных.
  2. должны быть унифицированы
  3. Не позволяйте возвращаемому коду состояния влиять на вашу бизнес-логику

Обратите внимание, не потеряйтесь

Если вы считаете, что то, что я написал, нормально, пожалуйста, поставьте мне лайк, подпишитесь и поделитесь, это отличная мотивация для меня.

Публичный номер think123, вы можете прочитать его в первый раз.

прошлый обзор

Эй, я использую Drone для CI

И интервьюер взрывает набор реплик MongoDB вот так

Знание этих навыков проектирования MongoDB может повысить эффективность на 50%

Я провел неделю, читая исходный код Kafka Producer.

Интервьюер: Как реализовать LRU с LinkedHashMap

Как я понимаю поток Java8

Больше не боюсь, что интервьюер спросит меня о JDK8 HashMap

Временные индексы в MongoDB