【问题标题】:Why this angular $http.put parameter won't get passed?为什么这个角度 $http.put 参数不会被传递?
【发布时间】:2016-09-21 18:41:19
【问题描述】:

我在我的 angularjs 应用程序中遇到了一个非常奇怪的案例。在工厂中,以下代码可以正常工作:

$http.put(apiBase + 'delete?id='+orderId);

这显然是连接到一个api来执行PUT操作(这里称为“删除”,但实际上只是更新记录中的一个标志)。

但是同样的代码,如果这样写,就不行了:

$http.put(apiBase + 'delete', {
    params: {
      id: orderId
    }
  }
);

这很有趣,因为我在其他一些工厂使用完全相同的语法来访问类似的 API,并且它们可以工作!

【问题讨论】:

    标签: angularjs angularjs-factory angularjs-http


    【解决方案1】:

    使用 $http.put 时,您不需要将数据包装在配置对象中。可以直接传递数据对象,然后省略第三个参数:

    $http.put(apiBase + 'delete', { id: orderId });
    

    您的其他工厂可能使用您问题中所述的语法,因为您正在发出 $http.get 或 $http.delete 请求。

    我发现这种用于各种“快捷方式”方法的 API 略有不同,令人困惑,我几乎认为最好完全避免使用它们。您可以看到与the documentation 的区别,其中get 和delete 有两个参数:

    get(url, [config]);
    delete(url, [config]);
    

    大多数其他快捷方式都有三个:

    post(url, data, [config]);
    put(url, data, [config]);
    

    请注意,[config] 对象在该文档页面上进一步定义,它定义了“params”属性:

    params – {Object.} – 字符串或对象的映射 将使用 paramSerializer 序列化并附加为 GET 参数。

    【讨论】:

      【解决方案2】:

      我相信这是因为$http.put() 的第二个参数是data 对象,而不是config 对象。您将 config 对象作为第二个参数传递。

      你可以试试:

      $http.put(apiBase + 'delete', null, {
          params: {
            id: orderId
          }
        }
      );
      

      https://docs.angularjs.org/api/ng/service/$http#put

      【讨论】:

      • 虽然这可行,但将 PUT 请求的有效负载包含在“data”属性(进入请求正文)中,而不是配置对象的“params”属性中更为惯用(生成查询字符串参数)。我意识到你只是在构建 OP 已经使用的代码,这更像是一个“仅供参考”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2014-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多