【问题标题】:How to send data with angularjs $http.delete() request?如何使用 angularjs $http.delete() 请求发送数据?
【发布时间】: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);
        });
    };

【问题讨论】:

    标签: javascript angularjs laravel-4


    【解决方案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 中,您可以传递配置数据,如标头等。

      【讨论】:

      【解决方案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
        猜你喜欢
        • 1970-01-01
        • 2015-09-15
        • 2016-01-06
        • 1970-01-01
        • 1970-01-01
        • 2013-03-20
        • 2014-09-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多