Ответ API 422 обрезает данные на стороне клиента - PullRequest
0 голосов
/ 23 ноября 2018

Я хотел бы вернуть Ответ 422 от моего API, который включает в себя как можно большую часть модели данных.Я создал метод в нашем BaseRepository, где мы передаем данные, и необязательное сообщение, чтобы вернуть как 422.

protected IHttpActionResult Create422Response<TData>(
    TData data,
    string message = "Resource validation failed."
)
{
    var response = new ResponseObject<TData>(data)
    {
        Status = "Failure",
        Message = message
    };

    return Content((HttpStatusCode)422, response);
}

На стороне клиента я ловлю ответ следующим образом:

var response = await _orderApiClient.ShowOrderForApproval(id);

if (response.StatusCode == (HttpStatusCode)422)
{
    Logger.LogWarning(response.Content);
    var responseJson = JObject.Parse(response.Content);
    ProcessValidationErrorsFromResponse(response);
}

Когда я смотрю на значение response.Content, я вижу, что JSON обрезается.

Если я передаю тот же объект данных через ответ OK, он работает.

protected IHttpActionResult CreateOkResponse<TData>(TData data, string message = "Call was successful")
{
    var response = new ResponseObject<TData>(data)
    {
        Status = "Success",
        Message = message
    };
    return Ok(response);
}

Зачем 422 обрезать данные?Может быть, что-то еще происходит?

ОБНОВЛЕНИЕ: Вот что делает ShowOrderForApproval:

    public async Task<IRestResponse> ShowOrderForApproval(int id)
    {
        var request = new RestRequest("/api/orders/{id}/approve/")
        {
            Method = Method.GET,
            RequestFormat = DataFormat.Json
        };
        request.AddUrlSegment("id", id.ToString());
        return await RsClient.SendRequestAsync(request, new HttpContextWrapper(HttpContext.Current));
    }

RsClient.SendRequestAsync:

    public static Task<IRestResponse> SendRequestAsync(RestRequest request, HttpContextBase context)
    {
        if (_client == null)
        {
            _client = Connect();
        }

        //If null, this is coming from the CI API and we've stored the value in the originating request header
        if (context.Session == null)
        {
            var authHeaderValue = context.Request.Headers["Authorization"];
            request.AddHeader("Authorization", "Bearer " + authHeaderValue);
        }
        else
        {
            var sessionTokenName = ConfigurationManager.AppSettings["SessionTokenName"];
            request.AddHeader("Authorization", "Bearer " + context.Session[sessionTokenName]);
        }           

        return Task.FromResult(_client.Execute(request));
    }

Обновление 2: Хорошо, большеобновления.Используя Почтальон, я могу получить все данные с 422. Наш RsClient использует RestSharp.

...