这是PATCH的一个好模式

时间:2013-02-08 13:45:52

标签: rest servicestack ormlite-servicestack

我正在实现一个允许对象PATCH编辑的REST样式API。 PATCH操作的目的是允许更新类中的一个或多个属性,而无需触及可能设置的其他属性。

ServiceStack OrmLite页面上的部分更新示例,但似乎需要使用硬编码来指示哪些字段将部分更新。在我的场景中,依赖于应用程序决定要发送哪些字段。

我还必须应对该对象可能尚未持久化的情况。

为了解决这个问题,我实施了以下内容:

public object Patch(Myclass request)
{
    HttpStatusCode SuccessCode;
    try
    {
        var result = (MyClass)Get(request);
        if (result != null)
        {
            request.PopulateWithNonDefaultValues(result);
            dbFactory.Run(dbCmd => dbCmd.UpdateNonDefaults(request, r => r.myId == request.myId));
        }
        else
        {
            dbFactory.Run(dbCmd => dbCmd.Save(request));
        }

        SuccessCode = HttpStatusCode.Accepted;
    }
    catch (Exception e)
    {
        log.Error(e);
        SuccessCode = HttpStatusCode.InternalServerError;
    }
    return new HttpResult()
    {
        StatusCode = SuccessCode
    };
}

它有效,但有些事情感觉不对,我确定必须有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

看起来没问题虽然你的代码会短得多,如果你只是抛出让它在出现错误时抛出C#异常,并且如果你继承自ServiceStack's New API base Service类你可以使用已有的Db属性,例如:

public object Patch(Myclass request)
{

    var result = (MyClass)Get(request);
    if (result != null)
    {
        request.PopulateWithNonDefaultValues(result);
        Db.UpdateNonDefaults(request, r => r.myId == request.myId);
    }
    else
    {
        Db.Save(request);
    }

    return new HttpResult
    {
        StatusCode = HttpStatusCode.Accepted
    };
}