如何在 Web API Post 方法中返回自定义消息

Posted

技术标签:

【中文标题】如何在 Web API Post 方法中返回自定义消息【英文标题】:How to return custom message in web API Post method 【发布时间】:2018-11-14 22:48:26 【问题描述】:

我希望以下 Post 方法通过将失败值分配给“result”变量来返回失败,但我不知道如何实现。理想情况下,它会说安装 ID 无效,但不确定我是否可以这样做:

[Authorize]
[HttpPost, Route("sendForDevelopment")]
public async Task<NotificationOutcome> Post([FromBody]string message, string installationId)


    string hubName = "myHubName";
    string hubNameDefaultShared = "myHubNameDefaultShared";

    NotificationHubClient hub = NotificationHubClient
                    .CreateClientFromConnectionString(hubNameDefaultShared, hubName, enableTestSend: true);

    var templateParams = new Dictionary<string, string>
    
        ["messageParam"] = message
    ;

    NotificationOutcome result = null;

    if (string.IsNullOrWhiteSpace(installationId))
    
        // output a installation id is null or empty message or assign failure to the result variable
    
    else
    
        result = await hub.SendTemplateNotificationAsync(templateParams, "$InstallationId:" + installationId + "").ConfigureAwait(false);
    

    return result;

【问题讨论】:

让操作的结果是一个IHttpActionResult 派生对象。这应该为您可以返回的内容提供更大的灵活性 @Nkosi 我在想那些话。如果操作的结果是 IHttpActionResult,它还会在成功的情况下包含与 NotificationOutcomeResult 相同的消息或类似的消息? 那么只需创建一个NotificationOutcome 的实例并根据需要进行填充 @Nkosi 我无法填充,我检查了 NotificationOutcome 的类定义,但没有弄清楚如何手动为其分配失败。 @Nkosi 我也刚尝试过 IHttpActionResult 但我在 result = await hub.SendTemplateNotificationAsync(..) 行中收到错误,说它不能将 NotificationOutcome 隐式转换为 IHttpActionResult 【参考方案1】:

让操作的结果是一个IHttpActionResult 派生对象。

当请求无效时,您可以更灵活地返回什么

例如

[Authorize]
[HttpPost, Route("sendForDevelopment")]
public async Task<IHttpActionResult> Post([FromBody]string message, string installationId) 

    if (string.IsNullOrWhiteSpace(installationId)) 
        var model = new 
            error = new 
                code = 400,
                message = "installation id is null or empty"
            
        
        return Content(HttpStatusCode.Badrequest, model); //400 Bad Request with error message
    

    string hubName = "myHubName";
    string hubNameDefaultShared = "myHubNameDefaultShared";

    var hub = NotificationHubClient
                    .CreateClientFromConnectionString(hubNameDefaultShared, hubName, enableTestSend: true);

    var templateParams = new Dictionary<string, string>
    
        ["messageParam"] = message
    ;

    NotificationOutcome result = await hub.SendTemplateNotificationAsync(templateParams, "$InstallationId:" + installationId + "").ConfigureAwait(false);
    return Ok(result); //200 OK with model result

对于错误的请求,响应正文看起来像


  "error": 
    "code": 400,
    "message": "installation id is null or empty"
  

在客户端,您检查响应的状态代码并进行相应处理。

var response = await client.PostAsync(url, content);
if(response.IsSuccessStatusCode)
    var result = await response.Content.ReadAsAsync<NotificationOutcomeResult>();

    //...
else 
    //...check why request failed.
    var model = await response.Content.ReadAsAsync<ErrorResponse>();

    var message = model.error.message;

    //...


//...

【讨论】:

@EmilRR1 我对原始答案进行了一些更新。 完美运行。

以上是关于如何在 Web API Post 方法中返回自定义消息的主要内容,如果未能解决你的问题,请参考以下文章

c#web api - 如何在post方法后返回ID?

如何在 dotnet core Web Api 中返回自定义错误消息

如何在 Spring Boot Api post 方法中接收自定义的 JSON 对象

在自定义授权 MVC4 Web Api 中访问 post 或 get 参数

Response.Redirect 在自定义 HttpModule 中使用 POST 方法

如何在目标c中的asp.net web api方法中使用POST方法?