【问题标题】:Setting headers and http params for a single request in restangular在restangular中为单个请求设置标头和http参数
【发布时间】:2014-02-13 01:11:13
【问题描述】:

我正在尝试使用 restangular 进行文件上传发布请求,我想在 restangular 中实现与以下相同的功能。 但是,我不确定如何为这个特定请求设置内容类型和 transformRequest。如果我理解正确, setDefaultHeader 会为所有后续请求设置它。还有其他方法吗?

myApp.service('$fileUpload', ['$http', function ($http) {
   this.uploadFileToUrl = function(file, uploadUrl){
      var filedata = new FormData();
      filedata.append('file', file);
      $http.post(uploadUrl, filedata, {
         transformRequest: angular.identity,
         headers: {'Content-Type': undefined}
      })
      .success(function(){
      })
      .error(function(){
      });
     }
}]);

【问题讨论】:

    标签: angularjs post file-upload restangular


    【解决方案1】:

    这里有两种情况,创建新项目的 POST 或编辑项目的 PUT:

    // Save new Item
    $scope.saveNew = function (item) {
    
      var data = new FormData();
      angular.forEach(item, function (fieldData, field) {
        data.append(field, fieldData);
      });
    
      Restangular
        .all('items')
        .withHttpConfig({transformRequest: angular.identity})
        .post(data, {}, {'Content-Type': undefined})
        .then(function () {
          // do on success
        }, function () {
          // do on failure
        });
    };
    
    // Edit existing Item
    $scope.save = function (item) {
    
      var data = new FormData();
      angular.forEach(item.plain(), function (fieldData, field) {
        data.append(field, fieldData);
      });
    
      Restangular
        .one('items', item._id)
        .withHttpConfig({transformRequest: angular.identity})
        .customPUT(data, undefined, {}, {'Content-Type': undefined})
        .then(function () {
          $location.path('sites');
        });
    

    【讨论】:

      【解决方案2】:

      要为单个请求设置标头,您只需添加一个包含标头名称和值的对象作为 .post()、.get() 或任何您需要的方法的参数。

      https://github.com/mgonto/restangular#element-methods

      Restangular.all('some-endpoint').post(postContent, {}, {'Content-Type': undefined}).then(function (response) {
          console.log('Weeeeee!!!');
      });
      

      至于我不确定的 transformRequest,我以前没有处理过类似的事情,这是我在文档中唯一能找到的:

      https://github.com/mgonto/restangular#setdefaulthttpfields

      但这似乎为所有不是你想要的请求设置了它,但至少是这样。

      无论如何,希望这会帮助你得到你想要的。

      编辑:

      由于 restangular 中的大多数请求类型都有一个查询参数,然后是您需要传入一个空白查询参数对象的标头,然后是标头,因此已更新示例以显示这一点。

      【讨论】:

        【解决方案3】:

        由于这是该问题在 Google 上的首次点击,请参阅 Restangular 问题跟踪器中的 Issue 420

        基本上,最新的 Restangular 有一个 withHttpConfig 函数,可以在发送请求之前设置 $http 选项。

        如果您在类似 example.com/api/users/:id/picture 的 URL 上有一个路由,该路由接受带有特定用户图像的分段上传,您可以执行以下操作:

        Users.one(2)
            .withHttpConfig({transformRequest: angular.identity})
            .customPOST(filedata, 'picture', undefined, {'Content-Type': undefined})
            .then(function(resp) {
                // File data post is complete here
            });
        

        默认情况下,Angular 会将使用$http 发送的任何数据转换为 JSON。 transformRequest 配置只是将默认转换替换为 NOP

        【讨论】:

        • 这个答案是最有用的,因为它解释了重要的信息。如果没有 transformrequest 设置,我的表单不是正确的多部分,即使内容类型没问题,边界标记也不存在。参考github.com/mgonto/…
        猜你喜欢
        • 2012-08-06
        • 1970-01-01
        • 2014-03-24
        • 2014-08-23
        • 2011-06-24
        • 1970-01-01
        • 2012-10-03
        • 2016-10-15
        • 1970-01-01
        相关资源
        最近更新 更多