【问题标题】:Send json data in Content of httpresponse in .net core API在 .net core API 的 httpresponse 内容中发送 json 数据
【发布时间】:2019-05-30 20:02:19
【问题描述】:

我正在尝试使用 API 在数据库中插入多个用户。现在,假设要插入三个用户,并假设一个用户没有被插入,但另外两个被成功插入。所以,我需要显示响应,显示用户第一个成功插入,用户第二个有错误。这就是为什么我使用了 httpResponseMessage 列表,并且在每个 httpresponsemessageobject 中,我将添加完整的用户 json,表明这是用户,失败或成功状态

所以,根据我的实现

我正在使用 foreach 循环在 db 中插入多个用户并返回这样的响应,但我从 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"
            };
    }
}

感谢和问候

【问题讨论】:

  • 你为什么有List&lt;HttpResponseMessage&gt;?它是如何使用的?您应该多花一点时间来改进您的问题,以便让我们清楚地了解问题所在。
  • 以下行将 json 添加到我的内容中,但 .net 核心 APi 现在无法发送响应。我不知道为什么? Content = new ObjectContent(JsonConvert.SerializeObject(user).GetType(), JsonConvert.SerializeObject(user),new JsonMediaTypeFormatter()),
  • @Svek,我刚刚编辑了问题。有意义吗?
  • 恐怕不行。我还是不明白你为什么有List&lt;HttpResponseMessage&gt;。

标签: api asp.net-web-api .net-core asp.net-web-api2 asp.net-core-webapi


【解决方案1】:

对于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"
        };
    }
}

【讨论】:

    【解决方案2】:

    根据一些 cmets,我不明白为什么您需要每个插入的状态代码而不是返回布尔值或类似插入的 Id。

    我认为这样的东西适用于您已经展示的内容以及返回用户对象:

     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。列表中的每个对象都将包含原始用户对象以及您想要的相关状态代码,包括成功和失败的处理.

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2020-04-04
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      相关资源
      最近更新 更多