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

时间:2013-10-22 22:25:10

标签: 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'});

有什么方法可以阻止typeid作为请求正文的一部分提交,只是在PUT有效负载中发送name?我不控制我提交的API,它似乎不喜欢我发送的额外参数。

谢谢!

更新 - 10/25/13 - 13:38

resource的文档说明了这一点:

  

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

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

resource.save({type:'@user', id:'@14', name:'Bob Dole'});

但它似乎不起作用。还是不知所措。

2 个答案:

答案 0 :(得分:33)

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

resource.save({id:14, type:'user'}, {name:'Bob Dole'});

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

非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}

答案 1 :(得分: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'}
    }}
);