Угловой, тип контента не отправляется с $http
угловой не добавляет правильный вариант типа контента, я попробовал следующую команду:
$http({
url: "http://localhost:8080/example/teste",
dataType: "json",
method: "POST",
headers: {
"Content-Type": "application/json"
}
}).success(function(response){
$scope.response = response;
}).error(function(error){
$scope.error = error;
});
приведенный выше код генерирует следующий http-запрос:
POST http://localhost:8080/example/teste HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 0
Cache-Control: no-cache
Pragma: no-cache
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31
Content-Type: application/xml
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
Referer: http://localhost:8080/example/index
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pt-BR,pt;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: JSESSIONID=C404CE2DA653136971DD1A3C3EB3725B
Как вы можете видеть, вместо "application/json", тип контента "application / xml". Я что-то упустил ?
6 ответов:
вы должны включить тело с запросом. В противном случае Angular удаляет заголовок типа содержимого.
добавить
data: ''
аргумент к$http
.
$http({ url: 'http://localhost:8080/example/teste', dataType: 'json', method: 'POST', data: '', headers: { "Content-Type": "application/json" } }).success(function(response){ $scope.response = response; }).error(function(error){ $scope.error = error; });
попробуйте вот так.
$http({ method: 'GET', url:'/http://localhost:8080/example/test' + toto, data: '', headers: { 'Content-Type': 'application/json' } }).then( function(response) { return response.data; }, function(errResponse) { console.error('Error !!'); return $q.reject(errResponse); }
в случае, если это кому-то полезно. Для AngularJS 1.5 x я хотел установить CSRF для всех запросов, и я обнаружил, что когда я это сделал:
$httpProvider.defaults.headers.get = { 'CSRF-Token': afToken }; $httpProvider.defaults.headers.put = { 'CSRF-Token': afToken }; $httpProvider.defaults.headers.post = { 'CSRF-Token': afToken };
Angular удалил тип контента, поэтому мне пришлось добавить это:
$httpProvider.defaults.headers.common = { "Content-Type": "application/json"};
В противном случае я получаю ошибку типа носителя 415.
поэтому я делаю это, чтобы настроить мое приложение для всех запросов:
angular.module("myapp.maintenance", []) .controller('maintenanceCtrl', MaintenanceCtrl) .directive('convertToNumber', ConvertToNumber) .config(configure); MaintenanceCtrl.$inject = ["$scope", "$http", "$sce", "$window", "$document", "$timeout", "$filter", 'alertService']; configure.$inject = ["$httpProvider"]; // configure the header tokens for CSRF for http operations in this module function configure($httpProvider) { const afToken = angular.element('input[id="__AntiForgeryToken"]').attr('value'); $httpProvider.defaults.headers.get = { 'CSRF-Token': afToken }; // only added for GET $httpProvider.defaults.headers.put = { 'CSRF-Token': afToken }; // added for PUT $httpProvider.defaults.headers.post = { 'CSRF-Token': afToken }; // added for POST // for some reason if we do the above we have to set the default content type for all // looks like angular clears it when we add our own headers $httpProvider.defaults.headers.common = { "Content-Type": "application/json" }; }
великолепно! Приведенное выше решение работает для меня. Была такая же проблема с
GET
звонок.method: 'GET', data: '', headers: { "Content-Type": "application/json" }
просто чтобы показать пример того, как динамически добавлять "Content-type" заголовок для каждого запроса POST. В мае случае я передаю POST params как строку запроса, что делается с помощью transformRequest. В этом случае его значение application / x-www-form-urlencoded.
// set Content-Type for POST requests angular.module('myApp').run(basicAuth); function basicAuth($http) { $http.defaults.headers.post = {'Content-Type': 'application/x-www-form-urlencoded'}; }
затем из перехватчика в методе запроса перед возвратом объекта конфигурации
// if header['Content-type'] is a POST then add data 'request': function (config) { if ( angular.isDefined(config.headers['Content-Type']) && !angular.isDefined(config.data) ) { config.data = ''; } return config; }