Отправьте данные json в Content of httpresponse в .net core API - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь вставить несколько пользователей в базу данных с помощью API.Теперь предположим, что нужно вставить трех пользователей, и предположим, что один пользователь не был вставлен, а два других успешно вставлены.Итак, у меня есть требование показать ответ, который показывает, что первый пользователь успешно вставлен, второй пользователь имеет ошибку.Вот почему я использовал список httpResponseMessage, и в каждом объекте httpresponsemessage я добавлю завершенного пользователя json, указывающего, что это был пользователь, у которого статус ошибки или сбой

Итак, согласно моей реализации

Я использую цикл foreach для вставки нескольких пользователей в БД и возвращаю ответ, как это, но мой respose из API не показывает объект "пользователь" в содержании:

public async Task<List<HttpResponseMessage>> InserUsers(JArray obj)
{
List<myDTO> users = obj.ToObject<List<myDTO>>();
List<HttpResponseMessage> list = new List<HttpResponseMessage>();
 foreach (var user in users)
{
    var response = Insert(user);
     list.Add(new HttpResponseMessage
                    {

                        Content = new StringContent(JsonConvert.SerializeObject(user), System.Text.Encoding.UTF8, "application/json"),
                        ReasonPhrase = response.ReasonPhrase,
                        StatusCode = response.StatusCode
                    });

}
return returnResposeList;
}

 public HttpResponseMessage Insert(User user)
{
     // do insert and if there is error

       return new HttpResponseMessage()
                {
                    StatusCode = HttpStatusCode.Error,
                    ReasonPhrase = $"Error"
                };

     else
    {
          return new HttpResponseMessage()
            {
                StatusCode = HttpStatusCode.OK,
                ReasonPhrase = $"Successfully inserted"
            };
    }
}

Спасибо & regards

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Для HttpResponseMessage, он используется для описания всего ответа, вам следует избегать возврата HttpResponseMessage с кратным HttpResponseMessage.

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

public class ApiResponseMessage
{
    //
    // Summary:
    //     Gets or sets the reason phrase which typically is sent by servers together with
    //     the status code.
    //
    // Returns:
    //     The reason phrase sent by the server.
    public string ReasonPhrase { get; set; }
    //
    // Summary:
    //     Gets or sets the status code of the HTTP response.
    //
    // Returns:
    //     The status code of the HTTP response.
    public HttpStatusCode StatusCode { get; set; }
    //
    // Summary:
    //     Gets or sets the content of a HTTP response message.
    //
    // Returns:
    //     The content of the HTTP response message.
    public object Content { get; set; }

}

А затем

[HttpPost("InserUsers")]
public async Task<List<ApiResponseMessage>> InserUsers()
{
    List<User> users = new List<User> {
        new User{ Name = "Jack" },
        new User{ Name = "Tom"},
        new User{ Name = "Tony"}
    };
    List<ApiResponseMessage> list = new List<ApiResponseMessage>();
    foreach (var user in users)
    {
        var response = Insert(user);
        list.Add(new ApiResponseMessage
        {

            Content = new { user },
            ReasonPhrase = response.ReasonPhrase,
            StatusCode = response.StatusCode
        });

    }
    return list;
}

public ApiResponseMessage Insert(User user)
{
    // do insert and if there is error
    if (user.Name == "Tom")
    {
        return new ApiResponseMessage()
        {
            StatusCode = HttpStatusCode.BadRequest,
            ReasonPhrase = $"Error"
        };
    }
    else
    {
        return new ApiResponseMessage()
        {
            StatusCode = HttpStatusCode.OK,
            ReasonPhrase = $"Successfully inserted"
        };
    }
}
0 голосов
/ 04 января 2019

Что касается некоторых комментариев, я не понимаю, зачем вам нужен код состояния для каждой вставки, а не возвращает логическое значение или что-то вроде вставленного идентификатора.

Я думаю, что-то подобное работает с тем, чтовы уже показали вместе с возвращаемыми объектами пользователя:

 public async Task<ObjectResult> InserUsers(JArray obj)
    {
        List<myDTO> users = obj.ToObject<List<myDTO>>();
        List<InsertUserResponseDto> list = new List<InsertUserResponseDto>();
        foreach (var user in users)
        {
            var isSuccess = Insert(user);
            list.Add(new InsertUserResponseDto
            {
                User = user,
                StatusCode = isSuccess ? StatusCodes.Status200OK : StatusCodes.Status500InternalServerError,
            });

        }

        var isSuccessfullInsert = list.Any(x => x.StatusCode == StatusCodes.Status207MultiStatus);
        return StatusCode(isSuccessfullInsert ? StatusCodes.Status207MultiStatus : StatusCodes.Status200OK, list);
    }

    public bool Insert(User user)
    {
        try
        {
            // Complete insert
            return true;
        }
        catch (Exception ex)
        {
            // Log Exception
            return false;
        }
    }

    public class InsertUserResponseDto
    {
        public User User { get; set; }
        public int StatusCode { get; set; }
    }

Я использовал код ответа 207, если какая-либо из вставок не удалась, в противном случае я использовал 200. Каждый объект в списке будет содержать оригиналпользовательский объект вместе со связанным кодом состояния, который вы хотели, включая обработку для успеха и неудачи.

...