#javascript #angularjs #ajax #rest #http-headers
#javascript #angularjs #ajax #остальное #http-заголовки
Вопрос:
Ниже приведен вызов, который я делаю для Rest API.Это всего лишь часть более крупного скрипта.
SomeServiceService.addNewCall = function(data)
{
deferred = $q.defer();
addNewPaymentMethodsServiceCall = $http({
url: rootUrl 'user/v1/something',
method: 'POST',
data: data,
headers: {
'Content-Type': 'application/json',
'Accept-Language': 'en-us'
}
}).success(function(response){
deferred.resolve(response);
}).error(function(response,status){
response.status= status;
deferred.reject(response);
});
return deferred.promise;
};
Проблема, с которой я сталкиваюсь, заключается в разнице Content-Type
в Chrome и Firefox.
В Chrome
Accept-Language:en-US
Cache-Control:no-cache
Content-Type:application/json
If-Modified-Since:Mon, 26 Jul 1997 05:00:00 GMT
Origin:https://mydomain
Pragma:no-cache
Referer:mydomain/users/app/
User-Agent:Mozilla/5.0(Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143
Safari/537.36
В Firefox
Accept text/html,application/xhtml xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-US
Cache-Control no-cache
Connection keep-alive
Content-Length 157
Content-Type application/json; charset=UTF-8
Host mydomain
If-Modified-Since Mon, 26 Jul 1997 05:00:00 GMT
Pragma no-cache
Referer https://mydomain/users/app/
User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:43.0) Gecko/20100101 Firefox/43.0
Несмотря на то, что в вызове ajax я явно объявляю Content-type
, application/json
что firefox добавляет charset-UTF-8
, что прерывает мой вызов API, поскольку API поддерживает только application/json
.
Как я могу заставить firefox не изменять тип содержимого? Это происходит только для POST, PUT.
Любые предложения или помощь приветствуются.
Комментарии:
1. Вы действительно должны исправить API. В 2016 году он должен быть в состоянии справиться с наличием параметра для типа содержимого.
2. Требования на стороне API являются надежными, и в документе говорится, что api поддерживает только application / json. Поэтому я не думаю, что изменение api является решением. Почему firefox добавляет что-то к типу содержимого, когда я явно определяю это в коде, вот что я хочу знать и исправить.
Ответ №1:
Ответ Квентина выше верен:
Вы действительно должны исправить API. В 2016 году он должен быть в состоянии справиться с наличием параметра для типа содержимого.
Сегодня у нас была та же проблема, и мы решили ее, изменив API: вместо проверки, равен ли тип содержимого ‘application / json’, мы проверяем, содержит ли тип содержимого эту строку.
Конкретный код зависит от языка, но для Python (с использованием Falcon REST framework) это был вопрос замены
if req.content_type == 'application/json':
с
if 'application/json' in req.content_type: