如何使用角度中的请求正文发送url模板参数?

Gre*_*lec 21 angularjs angularjs-resource

假设我有一个这样的资源设置:

resource = $resource(
    "http://foo.com/service/:type/:id",
    {},
    {save: {method:'PUT', params: {type:'@type', id: '@id'}}}
);
resource.save({type:'user', id:14, name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)

有什么方法可以阻止typeid作为请求体的一部分提交,只是发送namePUT有效载荷?我不控制我提交的API,它似乎不喜欢我发送它的额外参数.

谢谢!

更新 - 2013年10月25日 - 13:38

资源文档说:

如果参数值以@为前缀,则从数据对象中提取该参数的值(对非GET操作很有用).

这意味着这应该从数据中删除参数:

resource.save({type:'@user', id:'@14', name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.还是不知所措.

小智 33

使用第一个参数作为您的网址模板参数,并将您的帖子数据放在第二个参数中,如下所示:

resource.save({id:14, type:'user'}, {name:'Bob Dole'});
Run Code Online (Sandbox Code Playgroud)

以下是Angular文档中显示函数签名的行:

非GET"类"操作:Resource.action([parameters],postData,[success],[error])

这是plunker的一个例子

您获得的请求在正文中没有url参数:

Request URL:http://run.plnkr.co/JAOqZqW6RSywatUM/badUrl/user/14
Request Method:PUT
Request Payloadview source
{name:Bob Dole}
Run Code Online (Sandbox Code Playgroud)


Gre*_*lec 7

FWIW,我确实找到了一个解决方法,感谢@ Reboog711,通过包含一个transformRequest参数,如下所示:

resource = $resource(
    "http://foo.com/service/:type/:id",
    {},
    {save: {
        method:'PUT', 
        transformRequest:function(data) {
            delete data.type;
            delete data.id;
            return JSON.stringify(data);
        },
        params: {type:'@type', id: '@id'}
    }}
);
Run Code Online (Sandbox Code Playgroud)