Axios: Не отправлять заголовок по умолчанию

Созданный на 19 июл. 2016  ·  64Комментарии  ·  Источник: axios/axios

Если заголовок был установлен по умолчанию, похоже, нет никакого способа пропустить его в отдельном запросе. Установка null или undefined ничего не делает.

Самый полезный комментарий

transformRequest: [(data, headers) => {
    delete headers.common.Authorization
    return data
}]

работает на меня

Все 64 Комментарий

Не могли бы вы привести пример кода, демонстрирующий такое поведение? Какой заголовок по умолчанию вы пытаетесь отключить?

Если я устанавливаю 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.

чтобы обойти эту проблему до тех пор, пока не появится лучший способ обработки глобальной конфигурации, я передаю требуемые заголовки при каждом вызове, что не идеально.

545

У меня была такая же проблема, но я решил

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:

> Это применимо только для методов запроса PUT, POST, PATCH и DELETE.

У меня довольно похожая ситуация, но с запросом GET:

  1. ПОЛУЧИТЕ http://www.saasserviceprovider.com/notpublicapi с заголовком Authorization: Bearer mytoken
  1. Перенаправляет на конечную точку AWS S3. URL-адрес перенаправления содержит строку запроса: X-Amz-Signature=blahblahblah добавлено.

  2. 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:

  1. ПОЛУЧИТЬ http://www.saasserviceprovider.com/notpublicapi с заголовком Authorization: Bearer mytoken
  2. Перенаправляет на конечную точку AWS S3. URL-адрес перенаправления содержит строку запроса: X-Amz-Signature=blahblahblah добавлено.
  3. 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 .

Была ли эта страница полезной?
0 / 5 - 0 рейтинги