如何使用 angularjs $http.delete() 请求发送数据?

Posted

技术标签:

【中文标题】如何使用 angularjs $http.delete() 请求发送数据?【英文标题】:How to send data with angularjs $http.delete() request? 【发布时间】:2014-03-30 02:23:08 【问题描述】:

我有一个资源“角色”,它与“用户”有多对多的关系。要管理“角色”,我需要将角色 id 和用户 id 发送到服务器,以便它从正确的用户(不一定是登录用户)中删除角色

这是我正在尝试的,但根据docs,这是不可能的。我知道我可以在 uri 中发送这两个 id,但是我的 laravel 后端会自动设置资源/resourceid 的资源路由,如果可能的话我想使用它。有没有办法做到这一点,我错过了?

var removeRole = function (roleid, userid) 
        var input =[];
        input.user = userid;

        $http.delete('/roles/' + roleid, input).success(function (data, status) 
            console.log(data);
        );
    ;

【问题讨论】:

【参考方案1】:

请尝试在httpoptions中传递参数,您可以按照下面的功能进行操作

deleteAction(url, data) 
    const authToken = sessionStorage.getItem('authtoken');
    const options = 
      headers: new HttpHeaders(
        'Content-Type': 'application/json',
        Authorization: 'Bearer ' + authToken,
      ),
      body: data,
    ;
    return this.client.delete(url, options);
  

【讨论】:

【参考方案2】:

$http.delete 方法不接受请求正文。 你可以试试这个解决方法:

$http( angular.merge(, config || , 
    method  : 'delete',
    url     : _url,
    data    : _data
));

config 中,您可以传递配置数据,如标头等。

【讨论】:

在我序列化数据后为我工作。参数没有;将数据放在 url 上;像这样:像example.com/getIdeas?foo=bar&baz=boo,参数在问号之后【参考方案3】:

您可以通过 /users/1/roles/2 之类的 URL 执行 http DELETE。这将是最 RESTful 的方式。

否则我猜您可以将用户 ID 作为查询参数的一部分传递?类似的东西

$http.delete('/roles/' + roleid, params: userId: userID).then...

【讨论】:

我声明了一条路线 /roles/1/users/1 一切都很好,谢谢 好提示,我尝试不使用密钥 params,但删除请求仅适用于 params 密钥,非常感谢! 如果您希望通过正文发送,以便您可以使用 req.body 在 node.js 中访问(例如),请尝试像 @eldes 回答一样设置标头。然后你可以使用简写 $http.delete(, ).then ...【参考方案4】:

我的建议:

$http(
    method: 'DELETE',
    url: '/roles/' + roleid,
    data: 
        user: userId
    ,
    headers: 
        'Content-type': 'application/json;charset=utf-8'
    
)
.then(function(response) 
    console.log(response.data);
, function(rejection) 
    console.log(rejection.data);
);

【讨论】:

【参考方案5】:

我建议阅读此网址 http://docs.angularjs.org/api/ngResource/service/$resource

并重新评估您调用资源的删除方法的方式。

理想情况下,您希望调用资源项本身的删除,而不是将资源的 id 传递给 catch all delete 方法

但是 $http.delete 接受一个包含 url 和 data 属性的配置对象,您可以在那里制作查询字符串或将对象/字符串传递到数据中

也许是这样的

$http.delete('/roles/'+roleid, data: input);

【讨论】:

感谢您的回复,我不确定您的意思 bu=y 捕获所有删除方法。我正在尝试通过使用路由/角色来专门调用角色删除方法。因此它非常专门针对该特定资源(据我所知)。该特定的删除方法恰好也需要用户 ID 以及资源 ID 我的意思不是直接调用 $http.delete(),而是让你的 rest 资源返回一个资源项的集合,它们的操作参数已经到位......这样你可以调用例如 data.items[0].delete();而不必传递 ids 和周围的东西 但是,如果您想删除 10000 个条目,并且只想向后端提供一个 ID 列表,该怎么办。 10000 个单独的请求将意味着大量开销。因此,带有正文的 DELETE 会更有效。 我无法让 data 使用 $http.delete。 params 虽然有效。【参考方案6】:

多对多关系通常有一个链接表。将此“链接”视为一个实体,并为其赋予唯一的 ID,然后在删除请求中发送该 ID。

您将拥有一个类似 /user/role 的 REST 资源 URL 来处理对用户角色“链接”实体的操作。

【讨论】:

我喜欢这个答案,但是 laravel 有一个方便的 detach() 方法来处理多对多关系,一旦你正确设置了关系,它就会为你处理数据透视表,所以如果我可以获得用户 ID从那时起,该资源的删除方法就超级简单了 看起来 laravel 还应该提供一个方便的 REST 资源来删除多对多关系,但我不熟悉 laravel。关于您是否可以在 DELETE 请求中实际发送数据也存在一些混淆。这里讨论了很久:github.com/angular/angular.js/issues/3207

以上是关于如何使用 angularjs $http.delete() 请求发送数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AngularJS 使用 Bootstrap 警报

如何查看angularjs版本

如何使用angularJs

如何在 AngularJS 中使用 HTTPS?

如何使用angularjs实现按钮事件

如何使用 AngularJS $submitted?