如何在 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 方法中返回自定义消息的主要内容,如果未能解决你的问题,请参考以下文章
如何在 dotnet core Web Api 中返回自定义错误消息
如何在 Spring Boot Api post 方法中接收自定义的 JSON 对象
在自定义授权 MVC4 Web Api 中访问 post 或 get 参数