当我执行POST请求以便在服务器上创建对象时,我希望将201 HTTP状态代码设置为带有URI的响应头。
问题在于我不喜欢装饰"我的服务中的HTTP响应头,因为我将业务逻辑与传输逻辑混合在一起。
推荐的方法是什么?
答案 0 :(得分:2)
您可以在创建操作中使用属性。这清楚地表明了方法将返回的状态,而不是直接参与动作逻辑本身。
[AddHeader(HttpStatusCode.Created)]
public int Post(TestRequest request)
{
return 0; // Record Id
}
更精细的方法是,如果你真的想避免在你的服务中标记任何东西,那就是用一个可以被响应过滤器检测到的接口来装饰你的响应对象DTO,这将添加必要的标题。
因此,如果我们使用名为ICreated
public interface ICreated
{
}
我们可以将它添加到我们的回复DTO:
public class UserCreatedResponse : ICreated
{
public int Id { get; set; }
}
然后当我们从我们的行动方法中返回那种类型的回应时:
public class TestService : Service
{
public UserCreatedResponse Post(CreateUserRequest request)
{
return new UserCreatedResponse { Id = 123 };
}
}
如果我们在AppHost
Configure
方法中应用以下过滤器,它会收到正确的标题:
public override void Configure(Funq.Container container)
{
GlobalResponseFilters.Add((req, res, obj) => {
var result = obj as ICreated;
if(result != null) {
res.StatusCode = (int)HttpStatusCode.Created;
res.StatusDescription = "Created";
}
});
}
假设请求DTO,例如:
[Route("/User","POST")]
public class CreateUserRequest : IReturn<UserCreatedResponse>
{
public string Name { get; set; }
public int Age { get; set; }
}