gpt4 book ai didi

c# - 在 ApiController 上执行 POST 时处理发送的 id 的最佳实践?

转载 作者:行者123 更新时间:2023-12-02 08:31:45 24 4
gpt4 key购买 nike

考虑以下两种 POST 场景:

  1. POST/localhost/api/ - 插入实体,返回 200
  2. POST/localhost/api/1324 - 错误请求,返回 400

处理场景 2 的最佳方法是什么?

我是否什么都不做并假设使用我的 API 的开发人员会理解这是错误的?我是否在 POST 方法中添加代码来处理此问题并告诉他们这是一个错误的请求?

我意识到返回错误的请求可能是最好的选择,这就是我最终实现的,但我觉得可能有更好的方法来实现这一点,但我还没有发现。

我当前的代码如下:

[HttpPost]
public HttpResponseMessage Post(MyEntity entity) {
if(entity.Id != null)
throw new HttpResponseException(HttpStatusCode.BadRequest);

MyEntity saved = repository.Insert(entity);

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, saved);
response.Headers.Location = new Uri(Request.RequestUri, new Uri(saved.Id.ToString(), UriKind.Relative));

return response;
}

// Prevents any attempt to POST with a Guid in the url
[HttpPost]
public void Post(Guid Id) {
throw new HttpResponseException(HttpStatusCode.BadRequest);
}

谢谢!

最佳答案

你所做的事情似乎是有效的。尽管我有些怀疑我是否会这么做。

更正

我说过了

If you hadn't implemented this this additional method then the routing would have failed and would have normally returned a 404. I would be tempted to leave it with this behavior.

但是你是对的:

要使其按上述方式运行,即默认为 404,您需要以下路由配置:

       config.Routes.MapHttpRoute(
name: "DefaultCollectionApi",
routeTemplate: "api/{controller}",
defaults: new { },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) }
);

config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { },
constraints: new { httpMethod = new HttpMethodConstraint(HttpMethod.Get, HttpMethod.Put, HttpMethod.Delete) }
);

稍微改进现有方法

但是,如果您确实觉得需要开始监管动词和路由的组合,那么可能值得将此逻辑移至 ActionFilterAttribute 中。

如果您在顶部添加此路线,那么它将出现假设您按照惯例对所有路由使用 "id" ,您可以快速组合一个过滤器,使用 id 键在 RouteValues 中查找值> 并引发 400 异常。

public class ValidVerbAndRouteAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
object id;
if (actionExecutedContext.ActionContext.ActionArguments.TryGetValue("id", out id) &&
actionExecutedContext.Request.Method == HttpMethod.Post)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
}
}

关于c# - 在 ApiController 上执行 POST 时处理发送的 id 的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15089045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com