Если заголовок был установлен по умолчанию, похоже, нет никакого способа пропустить его в отдельном запросе. Установка null
или undefined
ничего не делает.
Не могли бы вы привести пример кода, демонстрирующий такое поведение? Какой заголовок по умолчанию вы пытаетесь отключить?
Если я устанавливаю axios.defaults.headers.common['Content-Type'] = 'application/json'
, я не могу отключить этот заголовок для отдельного запроса, я могу установить только другое значение.
Как ты пробовал убрать шапку? Используете что-то подобное?
axios.request('/path', {
headers: {
'Content-Type': null
}
});
да. Это не сработало
Извините, я пропустил method
в моем примере. Могло ли это быть причиной того, что это не сработало?
Я тоже пробовал установить метод. Я подозреваю, что это связано с Object.assign()
где-то, просто не обращая внимания на значение undefined
.
@tyrsius какую версию
Для справки вот мой тест:
it('should remove default headers when config indicates', function (done) {
var instance = axios.create();
instance.defaults.headers.common['Content-Type'] = 'application/json';
instance.post('/foo/bar/', {
firstName: 'foo',
lastName: 'bar'
}, {
headers: {
'Content-Type': null
}
});
getAjaxRequest().then(function (request) {
testHeaderValue(request.requestHeaders, 'Content-Type', null);
done();
});
});
У меня тоже была эта пробема.
Я пытаюсь удалить заголовок «Авторизация» из «общего», но единственный способ, который я нашел, заставить его работать, - это удалить свойство из axios.defaults.header, сделать запрос, а затем снова добавить свойство. снова.
Это будет проще, когда эта ошибка будет исправлена.
Это также проблема для меня (с использованием axios v0.14.0), особенно для конечных точек, которые используют Access-Control-Allow-Headers
, и в этом случае мне нужно убедиться, что определенные заголовки вообще не отправляются с запросом.
Я использую версию 15.2, и когда я это сделаю
headers: {
'Content-Type': null
}
он устанавливает значение заголовка равным нулю. но мне действительно нужно, чтобы имя заголовка было полностью удалено.
например, при использовании s3 и генерации заранее подписанного URL-адреса для публикации файла в корзине у вас не может быть заголовка Authenticate. но у меня есть авторизация по умолчанию, потому что подавляющее большинство моих запросов требует ее для моего собственного api.
способ, которым я обошел это, - это сделать следующее
var instance = axios.create();
instance.defaults.headers.common = {};
instance.put(signedUrl, file, {headers: {'Content-Type': file.type}})
.then(function (result) {
console.log(result);
})
.catch(function (err) {
console.log(err);
});
Изменить: это не работает должным образом. проблема в том, что когда вы очищаете заголовки
instance.defaults.headers.common = {};
он удаляет его на глобальном уровне. это приведет к выходу меня из системы, поскольку я использую заголовок для Auth.
чтобы обойти эту проблему до тех пор, пока не появится лучший способ обработки глобальной конфигурации, я передаю требуемые заголовки при каждом вызове, что не идеально.
У меня была такая же проблема, но я решил
delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove
У меня точная ситуация как @SepiaGroup
Я попытался перезаписать его с помощью null
и ''
но затем AWS видит null
как мою авторизацию и жалуется.
Я попытался удалить его из экземпляра, но затем моя авторизация была удалена глобально, поэтому я получил 403 на моем собственном сервере.
Я предполагаю, что моим обходным путем будет использование старого XHR
для этого, но это меня огорчает :(
+1 Также застрял в невозможности очистить заголовок по умолчанию для определенного вызова.
+1
+1
Я также наблюдаю такое поведение в последней версии (0.16.2). Наступает грусть :(
просто удали это
delete instance.defaults.headers.common.Authorization
````
the way below is not working.
----
I think we could create a logout method that recreate the axios instance to replace the old one.
let instance = axios.create ({параметры})
function: logout () {
instance = axios.create ({параметры})
}
`` ''
Я полагаю ,
Просто интересно, возможно, решение @axelgenus чище и требует меньшего «сброса» всего экземпляра Axios, из которого вы пытаетесь удалить конкретный настроенный заголовок.
Было бы неплохо иметь возможность НЕ отправлять заголовок по умолчанию без удаления свойств :)
+1
+1
+1. Кажется печальным, что вы не можете удалить заголовки для экземпляра. Это означает, что все экземпляры имеют ссылку на глобальную переменную.
+1
+1
+1 Пожалуйста, исправьте эту проблему.
+1
+1
+1
Мы сталкиваемся с той же проблемой. Большинство интерфейсных приложений, которые мы создаем, должны использовать несколько веб-сервисов Rest. Невозможность отказаться от заголовка безопасности - большая проблема для нас.
+1
+1
Попробуйте эти ребята по конкретному объекту запроса, наряду с заголовками, данными и методом:
transformRequest(data, headers) {
delete headers.common.Authorization;
return data;
}
Попробуйте это, это решит мою проблему:
удалить axios.defaults.headers.common ["Авторизация"]; // и создайте свои собственные заголовки
@mukeshyadav Это решение уже несколько раз упоминалось в этой ветке.
Подчеркнуто, что это не обязательно идеальное решение. Представив сценарий, в котором вы добавили свои собственные перехватчики запросов / ответов в экземпляр Axios, но хотите, чтобы один конкретный запрос не включал заголовки, используемые где-либо еще, вам придется удалить заголовок (-ы) и повторно добавить после запрос выполнен.
И наоборот, интересно, есть ли способ с относительной легкостью просто скопировать экземпляр Axios для использования в таких одноразовых случаях.
+1
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
работает на меня
@aaronatmycujoo Это кажется самым сексуальным решением. Хотя, интересно, удаляет ли такое удаление заголовка его из экземпляра Axios дальше по цепочке. Возможно, придется создать глубокую копию headers
или что-то в этом роде.
Я должен это проверить.
насколько я могу судить, это не так. хотя может быть крайний случай, когда я не запускаю
@SepiaGroup, вам не нужно добавлять заголовки целиком в ваши запросы ... Сделайте это:
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;
А в заголовках запроса вы увидите только application / json.
+1 спасибо @axelgenus ур решение сработало
+1
@aaronatmycujoo FTW !!! Его решение сработало как шарм ... ти!
Столкнулся с той же проблемой при попытке загрузить файлы на S3 (разрешить только один механизм аутентификации).
Пробовал решение от @SepiaGroup, но оно также удаляет заголовок auth глобально для всех следующих экземпляров :(
@aaronatmycujoo У меня это решение отлично работает! 🎉
Спасибо, ребята, что спасли мне день!
+1
+1
+1
axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;
У меня отлично работает !!!
Не уверен, что это общеизвестно, но есть набор «запрещенных заголовков» , которые нельзя удалить.
Accept-Charset
Accept-Encoding
Access-Control-Request-Headers
Access-Control-Request-Method
Connection
Content-Length
Cookie
Cookie2
Date
DNT
Expect
Host
Keep-Alive
Origin
Referer
TE
Trailer
Transfer-Encoding
Upgrade
Via
TypeError: невозможно преобразовать undefined или null в объект
delete axios.defaults.headers.cummon["Authorization"];
У вас есть опечатка @ putu-eka-mulyana, и я думаю, что это не место, чтобы сообщать о такой проблеме.
delete axios.defaults.headers.common["Authorization"];
+1, удалите кодировку из типа контента
+1, удалить заголовок Auth только для одного запроса, принять объект конфигурации запроса без явного удаления, просто передав какое-то значение, например undefined или null
+1, удалить заголовок Auth только для одного запроса, принять объект конфигурации запроса без явного удаления, просто передав какое-то значение, например undefined или null
У меня есть запрос OPTION перед моим запросом PUT, поэтому решение transformRequest от
В конечном итоге я создал отдельные экземпляры для запросов auth и public, поэтому мой заголовок auth применялся только к экземпляру auth.
// do not configure auth header
export const publicAxios = axios.create(...)
// configure auth header
export const authAxios = axios.create(...)
// no auth header present for public instance
publicAxios.put(...)
@rizen PR # 1845 от @codeclown позволит отключить заголовки, передав null
. Решит ли это проблему?
@rizen PR # 1845 от @codeclown позволит отключить заголовки, передав
null
. Решит ли это проблему?
да
Какое долгое путешествие. Надежда № 1845 будет объединена как можно скорее.
transformRequest: [(data, headers) => { delete headers.common.Authorization return data }]
Из документации axios:
У меня довольно похожая ситуация, но с запросом GET:
Authorization: Bearer mytoken
Перенаправляет на конечную точку AWS S3. URL-адрес перенаправления содержит строку запроса: X-Amz-Signature=blahblahblah
добавлено.
AWS S3 отклоняет вызов из-за двух аутентификаций:
Authorization bearer token
X-Amz-Signature=blahblahblah
Ни transformRequest
, transformResponse
, axios.interceptors.request
, axios.interceptors.response
похоже, не могут позволить мне ввести себя в процесс и временно удалить заголовок авторизации при нажатии перенаправление на AWS S3 - предположительно, если бы я мог войти после перенаправления, я мог бы что-то сделать, чтобы повлиять на delete headers.Authorization
.
Тот же вызов с запросом api / postman / etc работает.
Это безобразно неэффективный POS-терминал ... но он «работает ™». Получу ли я сейчас венчурное финансирование?
let retry = false;
await axios({
method: 'get',
url: "http://www.saasserviceprovider.com/notpublicapi",
headers: {
'Authorization': "Bearer mytoken",
}
})
.then((r) => {
//return successful
})
.catch ((e) => {
if (e.request.res.responseUrl.match(/s3.amazonaws.com/)) {
retry = e.request.res.responseUrl;
} else {
//log error
}
})
//Retry
if (retry) {
await axios.get(retry)
.then((r) => {
//return successful
}
})
.catch((e) => {
//log error
})
}
Если серьезно ... должно быть лучше (в рамках аксиом)
У меня довольно похожая ситуация, но с запросом GET:
- ПОЛУЧИТЬ http://www.saasserviceprovider.com/notpublicapi с заголовком
Authorization: Bearer mytoken
- Перенаправляет на конечную точку AWS S3. URL-адрес перенаправления содержит строку запроса:
X-Amz-Signature=blahblahblah
добавлено.- AWS S3 отклоняет вызов из-за двух аутентификаций:
- Заголовок:
Authorization bearer token
- Строка запроса:
X-Amz-Signature=blahblahblah
Ни
transformRequest
,transformResponse
,axios.interceptors.request
,axios.interceptors.response
похоже, не могут позволить мне ввести себя в процесс и временно удалить заголовок авторизации при нажатии перенаправление на AWS S3 - предположительно, если бы я мог войти после перенаправления, я мог бы что-то сделать, чтобы повлиять наdelete headers.Authorization
.Тот же вызов с запросом api / postman / etc работает.
Если серьезно ... должно быть лучше (в рамках аксиом)
@iyerusad Вы нашли способ лучше, чем ваш обходной путь? Я столкнулся с той же проблемой, и меня расстраивает то, что я, похоже, не могу перехватить перенаправление и удалить заголовок авторизации только для этого последующего запроса / запроса перенаправления (в данном случае для Amazon) 🤔
@iyerusad Вы нашли способ лучше, чем ваш обходной путь? Я столкнулся с той же проблемой, и меня расстраивает то, что я, похоже, не могу перехватить перенаправление и удалить заголовок авторизации только для этого последующего запроса / запроса перенаправления (в данном случае для Amazon) 🤔
Не совсем - используя вариант Б. снизу.
_ Варианты, которые я оценил: _
A. Принять альтернативную оболочку / клиент (например, запрос fetch api? Request? Вроде бы работал, но явно устарел). Это может быть самый чистый вариант, но означает переход на другой синтаксис клиента http.
Б. Оберните мой обходной путь в функцию и используйте эту функцию для запросов, которые, как я знаю, сталкиваются с этой проблемой - уродливо, казалось бы, менее эффективно, но использую это в данный момент.
C. Надеюсь, я идиот и неправильно использую аксиомы, и есть более разумный обходной путь с аксиомами.
D. Axios получил исправление / патч?
@mikhoq @iyerusad Не
Нет проблем - Открыл №2855.
@mikhoq, пожалуйста, добавьте комментарий, если у вас есть конечная точка публичного воспроизведения.
Итак, очевидно, что transformRequest
вызывается для запросов GET
? Я попробовал это, и это сработало, он удалил только заголовок для текущего запроса.
transformRequest: [(data, headers) => {
delete headers.common.Authorization
return data
}]
Но в документах говорится
//
transformRequest
позволяет изменять данные запроса перед их отправкой на сервер
// Это применимо только для методов запроса PUT, POST, PATCH и DELETE
Это заставило меня подумать, что transformRequest
не будет вызываться для запросов GET
, но это так. Так что же на самом деле означает эта линия?
«Это применимо только для методов запроса PUT, POST, PATCH и DELETE»
Возможно, «Это потенциально полезно только для ....» ....? Имо, это вводит в заблуждение.
это работает:
заголовки: {
'content-type': 'приложение / json',
'Авторизация': ноль,
}
Пытался установить { headers: { 'Content-Type' = null } }
безуспешно,
поэтому, чтобы добавить полезный комментарий @axelgenus , мне пришлось пойти немного дальше:
import Axios from 'axios'
const client = Axios.create({
// ...
transformRequest: [(data, headers) => {
// add required "Content-Type" whenever body is defined
if (data) headers['Content-Type'] = 'application/x-www-form-urlencoded'
return data
}],
})
// completely remove "Content-Type" from instance by default
delete client.defaults.headers.common['Content-Type']
delete client.defaults.headers.post['Content-Type']
delete client.defaults.headers.put['Content-Type']
delete client.defaults.headers.patch['Content-Type']
// ...
Пример использования - реализация уровня запросов для метода аутентификации Bitstamp API V2 .
Самый полезный комментарий
работает на меня