Как лучше вернуть ошибку проверки Grp c - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы знать, есть ли шаблон для проверки полей в сервисах grp c.

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

Мой вопрос: есть ли шаблон, которому нужно следовать? Если нет, то какой из приведенных ниже примеров больше соответствует ожидаемому?

Пример 1:

Metadata trailers = new Metadata();
trailers.Add("Name", "is required");
trailers.Add("Age", "is required");
trailers.Add("Age", "must be over 21");
throw new RpcException(new Status(StatusCode.InvalidArgument, "Invalid Argument"), trailers, "One or more errors");

Пример 2:

Metadata trailers = new Metadata();
trailers.Add("errors", @"{""Name"":[""Is required""],""Age"":[""Is required"",""must be over 21""]}");
throw new RpcException(new Status(StatusCode.InvalidArgument, "Invalid Argument"), trailers, "One or more errors");

Я бы хотел чтобы взять этот ответ и преобразовать его в json, используя спецификацию RF C 7807, когда это необходимо

1 Ответ

1 голос
/ 04 августа 2020

Я не знаком с C# API, но могу немного рассказать о gRP C API, и, возможно, он поможет вам в реализации C#.

gRP C модель ошибки Модель ошибки логически определяется как google.rp c .Status , экземпляр которого возвращается клиенту при возникновении ошибки API. В следующем фрагменте кода показан общий дизайн модели ошибки, которая возвращается, когда что-то идет не так:

package google.rpc;

message Status {

  // A simple error code that can be easily handled by the client. The
  // actual error code is defined by `google.rpc.Code`.
  int32 code = 1;

  // A developer-facing human-readable error message in English. It should
  // both explain the error and offer an actionable resolution to it.
  string message = 2;

  // Additional error information that the client code can use to handle
  // the error, such as retry delay or any business possible errors
  repeated google.protobuf.Any details = 3;

}

Вы должны использовать поле сведений, чтобы передать дополнительную информацию об ошибке. Например, для InvalidArgument вы должны передать объект BadRequest с нарушениями полей

Что-то вроде (Golang code, надеюсь, это имеет смысл для вас)

st := status.New(codes.InvalidArgument, "invalid username")
v := &BadRequest_FieldViolation{
    Field: "username",
    Description: "The username must only contain alphanumeric characters",
}
br := &BadRequest{}
br.FieldViolations = append(br.FieldViolations, v)
st, _ := st.WithDetails(br)

Здесь - это список объектов, предоставляемых gRP C, который вы можете использовать в качестве сведений об ошибке, если любой из них соответствует вашему сценарию, вы всегда можете создать свой собственный.

Рекомендуется возвращать в поле сведений что-то, связанное с бизнесом. Как известный код ошибки. Таким образом, ваш клиент сможет ответить на проблему.

errorDetail := &BusinessError{
  ErrorCode: CODE,
  ErrorMessage: "Failed to filter hotel rooms",
}
st := status.New(codes.Internal, "Something went wrong :( ")
st, _ = st.WithDetails(errorDetail)
...