2014-01-22 2 views
8

Я пытаюсь использовать restangular для отправки по почте, я хочу достичь той же функциональности, что и ниже, в restangular. Однако я не знал, как установить тип контента и transformRequest только для этого конкретного запроса. Если я правильно понимаю, setDefaultHeader устанавливает его для всех последующих запросов. Есть ли другой способ?Настройка заголовков и параметров http для одного запроса в restangular

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(){ 
     }); 
    } 
}]); 

ответ

6

Чтобы установить заголовки для одного запроса все, что вам нужно сделать, это добавить объект, содержащий имя и значение заголовков в качестве аргумента .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

Но это, кажется, устанавливает его для всех запросов, которые не то, что вы хотите, но это что-то хотя бы.

В любом случае, надеюсь, это поможет вам получить то, что вы хотите.

Edit:

Поскольку большинство типов запросов в restangular имеет параметры запроса, а затем заголовки, которые необходимо передать в пустом объекте пар запроса и затем заголовки, например, было обновлен, чтобы показать это ,

5

Поскольку это первый хит в Google для этой проблемы, см. Issue 420 в трекер-репортаже.

В основном новейший Restangular имеет функцию withHttpConfig для установки $http вариантов перед отправкой запроса.

Если у вас есть маршрут по URL, что-то вроде example.com/api/users/:id/picture, который принимает многослойную загрузку с изображением для конкретного пользователя вы могли бы сделать что-то вроде:

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

По умолчанию угловому преобразует любые данные, отправленные с $http к JSON. Конфигурация transformRequest просто заменяет это преобразование по умолчанию на NOP.

+1

Этот ответ был наиболее полезен, поскольку он объясняет жизненно важную часть информации. Без transformrequest-установки моя форма не была надлежащей многочастной, хотя контент-тип был в порядке, маркер границы отсутствовал. См. Https://github.com/mgonto/restangular#how-can-i-send-files-in-my-request-using-restangular –

8

У вас есть 2 ситуации здесь, то 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'); 
    }); 
Смежные вопросы