将多个值从 WebApi(post)返回到 AngularJs

Posted

技术标签:

【中文标题】将多个值从 WebApi(post)返回到 AngularJs【英文标题】:Returning multiple values from WebApi (post) to AngularJs 【发布时间】:2018-08-14 13:46:46 【问题描述】:

我正在使用 .net core C#、WebApi 和 AngularJs。

为了保存数据,我的 Angularjs 代码对我的 WebApi 进行了 $http 调用。我可以很好地从我的 api 返回单个数据,但不确定在这里返回多个值的最佳方法是什么。我可以用逗号分隔然后返回,但想知道是否有更好的方法。

所以基本上当 API 将数据保存到我的数据库时,我想返回一个变量,如果保存成功则返回布尔值,如果保存不成功则返回异常消息。下面是我的代码。

AngularJs 代码:

service.saveData(data).then(function (res)                           
    //get someDataToReturn, dataSaved & exception raised if any from db save here.
    , function (err) 
);

WebApi 代码:

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)

    bool dataSaved = true;
    string someDataToReturn = string.Empty;
    //do some processing and updating someDataToReturn here         

    //Saving data to DB
    dataSaved = SaveData(data);                

    //I want to return someDataToReturn, dataSaved(true or false) and exception raised from SaveData if any 
    return Ok(someDataToReturn);


//DB Call to save data
public bool SaveData(List<UserData> data)
           
    try
    
        foreach (var set in data)
        
            //creating query etc

            _db.Execute(query);
                        

        return true;
    
    catch (SqlException ex)
    

    
    return false;

让我知道最好的方法。

【问题讨论】:

为什么要返回truefalse?如果保存成功,返回someDataToReturn。另一个,返回带有抛出异常的 HTTP 错误代码。 【参考方案1】:

首先,您应该检查请求正文中的值是否正确填充。

看看DataAnnotations。 您可以使用注释来指定模型中哪些属性是必需的、最小和最大长度等。

这是一个关于如何定义 UserData 类所需的 Name 属性的示例

public class UserData

    [Required]  
    public string Name  get; set;         

如果请求模型不满足在 UserData 类 DataAnnotations 上设置的指定规则,则上下文 ModelState 将设置为 false 并包含 DataAnnotations 错误。 这可用于确定当前请求是否为错误请求并从中返回正确的 http 状态代码。

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)

    if (!ModelState.IsValid)
        return BadRequest(ModelState); //will return a 400 code
    ...

然后关于 SaveData 方法。在控制器中捕获异常并从那里返回正确的状态码

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)

    if (!ModelState.IsValid)
        return BadRequest(ModelState); //400 status code

    try
    
        SaveData(data);
    
    catch(Exception e)
    
        return InternalServerError(e); //500 status code
    

    string someDataToReturn = string.Empty;
    return Ok(someDataToReturn ); //200 status code


public void SaveData(List<UserData> data)
           
    foreach (var set in data)
    
        //creating query etc

       _db.Execute(query);
                    

【讨论】:

@Macus,谢谢这个作品。有一件事虽然我使用状态 Ok 可以正常工作,但没有任何 InternalServerError 返回代码,因为它给了我错误,这在当前上下文中不存在。这个有没有替代品。我正在使用 .net core 2.0 c#。 Status Ok、BadRequest 等是 Microsoft.AspNetCore.Mvc ControllerBase 类的一部分。可能是我错过了,但我在此类中找不到等效的 InternalServerError。 @aman 太棒了!以下是如何在核心***.com/a/37793718中返回 500@ 知道了。最后一个问题。使用上面的 API,我可能会发送另一个参数,它基本上是一个布尔值 true 或 false。如果为真,则意味着用户没有在数据参数中发送任何用户数据,在这里我需要更新 db.xml 中的标志。现在上面的问题是,由于数据参数为空,model.isvalid 变为下降。我不认为这是一个好方法,但目前这是我可能需要处理的。有没有解决方法。我当然可以检查数据是否为空,然后执行 ModelStatis.IsValid 但它可能会破坏它的目的。 @aman 听起来您应该为该逻辑创建一个新的端点。如果该方法有多个职责,那么您很可能应该将其分解为多个部分【参考方案2】:

您可以使用Controller 类方法Json(object data)。比如:

[HttpPost("data/save")]
public async Task<IActionResult> SaveData([FromBody] List<UserData> data)

    return this.Json(SaveData(data));

见this。

【讨论】:

【参考方案3】:

你可以创建一个实体并返回它

public class BaseResult
     public bool Resultget;set;
     public string Errorsget;set;

或只有

return Ok( new  result = dataSaved , error= exception.Message);

【讨论】:

【参考方案4】:

标准方式是: 返回201状态码https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/201

    [HttpPost("data/save")]
    public async Task<IHttpActionResult> SaveData([FromBody] List<UserData> data)
    
        try
        
            if (!ModelState.IsValid)
                return BadRequest(ModelState); 

            // return response of 201 if you created the resource successfully
            // typically return this with a uri to the new resource
            return Created("location", saveData(data));
        
        catch (Exception)
        
            return InternalServerError();
        
    

【讨论】:

以上是关于将多个值从 WebApi(post)返回到 AngularJs的主要内容,如果未能解决你的问题,请参考以下文章

如何将简单值从 axios.post 发送到 asp.net 核心?

c# webapi post多个参数

WebAPI 多个 Put/Post 参数

如何将多个值从模板传递到模板?

将多个值从表单插入到数组

如何将数据值从视图传递到 Django 中的模板?