.NET Web API HttpResponseMessage 模式?

Posted

技术标签:

【中文标题】.NET Web API HttpResponseMessage 模式?【英文标题】:.NET Web API HttpResponseMessage Pattern? 【发布时间】:2013-12-03 17:12:38 【问题描述】:

所以我已经看到 Web API 2 控制器返回 HttpResponse 和实际对象。示例:

 public HttpResponseMessage Get(string id)
    
        var app = apps.Single(c => c.Id == id);

        return new HttpResponseMessage(HttpStatusCode.OK)
        
            Content = new ObjectContent<object>(app,
                Configuration.Formatters.JsonFormatter)
        ;
    

 public Application Get(string id)
    
        return apps.Single(c => c.Id == id);
    

我的问题是“正确”的方式? #2 要短得多,但最好是做 #1 还是 #2 自动做 #1 ... ?

【问题讨论】:

【参考方案1】:

请参阅 this 和 this SO 问题。

两种情况下的响应都是相同的 (HttpResponseMessage)。

HttpResponseMessage 允许您使用 HTTP 协议(​​例如,通过 Headers 属性)并统一您的返回类型。

返回 CLR 类型可能更具可读性,但您会失去返回具有不同状态代码的不同类型的灵活性,除非您使用 dynamicobject,这违背了返回特定类型的目的。

就个人而言,我更喜欢使用 IHttpActionResult(在 v2 中添加)并在控制器操作上为预期的返回类型指定 ResponseTypeAttribute 以提高可读性。

[HttpGet]
[ResponseType(typeof(Portfolio))]
public IHttpActionResult GetPortfolio([FromUri] long id)

    // get portfolio

    return Ok(portfolio);

您可以使用默认的IHttpActionResult 实现(参见上面的OkResult)轻松地操纵响应消息(以RESTful 方式)。避免自己构建HttpResponseMessage 也可以保持代码干净。 Here 是IHttpActionResult 上的官方文章,here 是HttpResponseMessageIHttpActionResult 上的有趣对话。

【讨论】:

有道理。谢谢! 可以说,你不想让返回不同类型的灵活性;这只是混淆了服务的意图并使其不那么自我记录。 IMO,鉴于两种方法可以产生完全相同的输出,因此代码越少越好。另外,当您需要使用 HTTP 协议时,您总是可以切换到返回 HttpResponseMessage。否则,HttpResponseMessage 方法只会增加混乱。 自记录 API 参数是有意义的,但您可以使用 [ResponseType] 属性向 Swagger 等外部文档发送 API 响应类型信号。我个人比较喜欢return BadRequest()Request.CreateErrorResponse 相比的流畅度。此外,IHttpActionResult 实现可以做的不仅仅是返回一个值(例如添加标题、日志消息等)

以上是关于.NET Web API HttpResponseMessage 模式?的主要内容,如果未能解决你的问题,请参考以下文章

在调用不同 API 的 APIController 方法中返回 HttpResponse

.NET 4.6 HttpResponse.PushPromise 方法来管理 http/2 PUSH_PROMISE 标头

Python入门自学进阶-Web框架——4HttpRequest和HttpResponse及模板

muduo源码-HttpResponse.h

web前端怎么调用api接口

HttpResponse对象