Axios: Jangan kirim tajuk default

Dibuat pada 19 Jul 2016  ·  64Komentar  ·  Sumber: axios/axios

Jika tajuk telah ditetapkan sebagai default, tampaknya tidak ada cara untuk melewatinya pada permintaan individual. Menyetel null atau undefined tidak menghasilkan apa-apa.

headers

Komentar yang paling membantu

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

bekerja untuk saya

Semua 64 komentar

Bisakah Anda memberikan beberapa contoh kode yang menunjukkan perilaku itu? Header default apa yang Anda coba hapus?

Jika saya menetapkan axios.defaults.headers.common['Content-Type'] = 'application/json' , saya tidak dapat menghapus tajuk itu untuk permintaan individual, saya hanya dapat mengaturnya ke nilai lain.

Bagaimana Anda mencoba menghapus tajuk? Menggunakan sesuatu seperti ini?

axios.request('/path', {
  headers: {
    'Content-Type': null
  }
});

Ya. Itu tidak berhasil

Maaf saya melewatkan method dalam contoh saya. Mungkinkah itu yang membuatnya tidak berhasil?

Saya telah mencoba mengatur metode juga. Saya menduga itu ada hubungannya dengan Object.assign() suatu tempat hanya tidak memperhatikan nilai undefined .

@tyrsius versi

Untuk referensi di sini adalah tes saya:

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

Saya juga punya masalah ini.
Saya mencoba untuk menghapus tajuk 'Otorisasi' dari 'umum' tetapi satu-satunya cara yang saya temukan untuk membuatnya berfungsi adalah menghapus properti dari axios.defaults.header, membuat permintaan, dan kemudian menambahkan properti kembali lagi.
Ini akan lebih mudah bila ini bug adalah tetap

Ini juga merupakan masalah bagi saya (menggunakan axios v0.14.0), terutama untuk titik akhir yang menggunakan Access-Control-Allow-Headers , dalam hal ini saya perlu memastikan header tertentu tidak dikirim dengan permintaan sama sekali.

saya menggunakan versi 15.2 dan ketika saya melakukannya

headers: {
      'Content-Type': null
    }

itu mengatur nilai header ke nol. tetapi saya benar-benar membutuhkan nama tajuk untuk dihapus sepenuhnya.

misalnya saat menggunakan s3 dan membuat url yang telah ditentukan untuk memposting file ke ember, Anda tidak dapat memiliki header Otentikasi. tetapi saya memiliki set Otorisasi default karena sebagian besar permintaan saya memerlukannya untuk api saya sendiri.

cara saya menyiasatinya adalah dengan melakukan hal berikut

    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);
        });

Sunting: ini tidak berfungsi seperti yang diharapkan. masalahnya adalah ketika Anda menghapus tajuk

instance.defaults.headers.common = {};

itu menghapusnya di tingkat global. ini akan mengeluarkan saya karena saya menggunakan tajuk untuk Auth.

untuk mengatasi masalah ini sampai ada cara yang lebih baik untuk menangani konfigurasi global saya melewati header yang diperlukan pada setiap panggilan, tidak ideal.

545

Saya memiliki masalah yang sama tetapi diselesaikan dengan

delete axios.defaults.headers.common["Authorization"]; // or which ever header you have to remove

Saya memiliki situasi yang tepat sebagai @SepiaGroup
Saya mencoba menimpanya dengan null dan '' tetapi kemudian AWS melihat null sebagai Otorisasi dan keluhan saya.
Saya mencoba menghapusnya dari instance tetapi kemudian Otorisasi saya dihapus secara global sehingga saya mendapatkan 403 di server saya sendiri.

Saya kira solusi saya adalah menggunakan XHR untuk ini tetapi itu membuat saya sedih :(

+1 Juga macet karena tidak dapat menghapus tajuk default untuk panggilan tertentu.

+1

+1

Saya juga melihat perilaku ini di versi terbaru (0.16.2). Kesedihan terjadi :(

hapus saja

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.

biarkan contoh = axios.create({options})

fungsi: keluar () {
contoh = axios.create({options})
}
```

@ lzp4ever yang akan bekerja dalam banyak kasus, saya harapkan. Tetapi dalam kasus di mana seseorang telah menambahkan pencegat permintaan dan respons, atau melakukan lebih banyak konfigurasi instance di luar sekadar meneruskan opsi konfigurasi, bukankah pendekatan Anda mengharuskan semua itu dilakukan ulang?

Hanya ingin tahu apakah mungkin solusi @axelgenus lebih bersih dan membutuhkan lebih sedikit "

Akan menyenangkan untuk TIDAK mengirim header default tanpa menghapus properti :)

+1

+1

+1. Tampaknya menyedihkan bahwa Anda tidak dapat menghapus tajuk misalnya. Ini berarti bahwa semua instance memiliki referensi ke variabel global.

+1

+1

+1 Tolong perbaiki masalah ini.

+1

+1

+1

Kami mengalami masalah yang sama. Sebagian besar aplikasi front-end yang kami buat perlu menggunakan beberapa layanan web Istirahat. Tidak dapat menyisih dari header keamanan adalah masalah besar bagi kami.

+1

+1

Coba orang-orang ini pada objek permintaan khusus, bersama dengan tajuk, data, dan metode:
transformRequest(data, headers) { delete headers.common.Authorization; return data; }

Coba ini, ini menyelesaikan masalah saya:

hapus axios.defaults.headers.common["Otorisasi"]; // dan buat tajuk Anda sendiri

@mukeshyadav Solusi itu telah disebutkan beberapa kali lebih jauh di utas ini.

Intinya adalah bahwa ini belum tentu merupakan solusi ideal. Membayangkan skenario di mana Anda telah menambahkan pencegat permintaan/respons kustom Anda sendiri ke instance Axios, tetapi Anda ingin satu permintaan khusus tidak menyertakan header yang digunakan di tempat lain, Anda harus menghapus header dan menambahkan kembali setelahnya permintaan selesai.

Sebaliknya, bertanya-tanya apakah ada cara Anda dapat, dengan relatif mudah, cukup menduplikasi instance Axios untuk digunakan dalam jenis kasus satu kali ini.

+1

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

bekerja untuk saya

@aaronatmycujoo Itu sepertinya solusi paling seksi di sini. Meskipun, bertanya-tanya apakah menghapus tajuk seperti itu menghapusnya dari instance Axios lebih jauh ke atas rantai. Mungkin harus membuat salinan dalam headers atau sesuatu.

Saya harus menguji itu.

dari apa yang saya tahu itu tidak. meskipun mungkin ada kasus tepi yang tidak saya picu

@SepiaGroup Anda tidak perlu menambahkan header di seluruh permintaan Anda... Lakukan ini:

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;

Dan di header permintaan Anda hanya akan melihat 'application/json'

+1 terima kasih @axelgenus, solusi Anda berhasil

+1

@aaronatmycujoo FTW!!! Solusinya bekerja seperti pesona...ty!

Menghadapi masalah yang sama ketika mencoba mengunggah file ke S3 (hanya mengizinkan satu mekanisme auth).
Mencoba solusi dari @SepiaGroup tetapi juga menghapus auth header secara global untuk semua contoh berikut :(
@aaronatmycujoo Solusi ini bekerja dengan sempurna untuk saya! 🎉
Terima kasih teman-teman karena telah menyelamatkan hari saya!

+1

+1

+1

axios.defaults.headers.common = {};
axios.defaults.headers.common.accept = ‘application/json’;

Bekerja sangat baik untuk saya!!!

Tidak yakin apakah ini pengetahuan umum, tetapi ada satu set "header terlarang" , yang tidak dapat dihapus.

  • 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

kesalahan

TypeError: Tidak dapat mengonversi undefined atau null ke objek

delete axios.defaults.headers.cummon["Authorization"];

Anda salah ketik @putu-eka-mulyana juga saya pikir ini adalah tempat yang salah untuk melaporkan masalah seperti itu.

delete axios.defaults.headers.common["Authorization"];

+1, hapus rangkaian karakter dari tipe konten

+1, hapus header Auth hanya untuk satu permintaan, ambil objek konfigurasi permintaan tanpa menghapus secara eksplisit, hanya dengan memberikan beberapa nilai seperti undefined atau null

+1, hapus header Auth hanya untuk satu permintaan, ambil objek konfigurasi permintaan tanpa menghapus secara eksplisit, hanya dengan memberikan beberapa nilai seperti undefined atau null

Saya memiliki permintaan OPSI sebelum permintaan PUT saya, jadi solusi transformRequest @aaronatmycujoo berfungsi untuk permintaan OPSI saya, tetapi header Otorisasi masih diterapkan pada permintaan PUT saya.

Pada akhirnya saya akhirnya membuat instance terpisah untuk auth vs permintaan publik sehingga header auth saya hanya diterapkan pada instance 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 oleh @codeclown akan memungkinkan header yang tidak null . Apakah ini akan menyelesaikan masalah?

@rizen PR #1845 oleh @codeclown akan memungkinkan header yang tidak null . Apakah ini akan menyelesaikan masalah?

Ya

Perjalanan yang panjang. Hope #1845 get's digabung secepatnya.

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

Dari dokumentasi axios:

> Ini hanya berlaku untuk metode permintaan 'PUT', 'POST', 'PATCH' dan 'DELETE'

Saya mengalami situasi yang agak mirip tetapi dengan permintaan GET:

  1. DAPATKAN http://www.saasserviceprovider.com/notpublicapi dengan tajuk Authorization: Bearer mytoken
  1. Pengalihan ke titik akhir AWS S3. URL pengalihan memiliki string kueri: X-Amz-Signature=blahblahblah ditambahkan.

  2. AWS S3 menolak panggilan karena dua Otentikasi:

    • Judul: Authorization bearer token
    • String kueri: X-Amz-Signature=blahblahblah

Baik transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response tampaknya tidak dapat mengizinkan saya untuk menyuntikkan diri ke dalam proses dan menghapus sementara Header Otorisasi saat menekan redirection ke AWS S3 - mungkin jika saya bisa masuk setelah redirect saya bisa melakukan sesuatu untuk mempengaruhi delete headers.Authorization .

Panggilan yang sama dengan request api/postman/etc berfungsi.

"Solusi":

Ini adalah POS mengepul yang jelek dan tidak efisien... tetapi "berfungsi™". Apakah saya mendapatkan pendanaan VC sekarang?

  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
    })
  }

Serius meskipun ... harus menjadi cara yang lebih baik (dalam aksioma)

Saya mengalami situasi yang agak mirip tetapi dengan permintaan GET:

  1. DAPATKAN http://www.saasserviceprovider.com/notpublicapi dengan tajuk Authorization: Bearer mytoken
  2. Pengalihan ke titik akhir AWS S3. URL pengalihan memiliki string kueri: X-Amz-Signature=blahblahblah ditambahkan.
  3. AWS S3 menolak panggilan karena dua Otentikasi:
  • Judul: Authorization bearer token
  • String kueri: X-Amz-Signature=blahblahblah

Baik transformRequest , transformResponse , axios.interceptors.request , axios.interceptors.response tampaknya tidak dapat mengizinkan saya untuk menyuntikkan diri ke dalam proses dan menghapus sementara Header Otorisasi ketika menekan redirection ke AWS S3 - mungkin jika saya bisa masuk setelah redirect saya bisa melakukan sesuatu untuk mempengaruhi delete headers.Authorization .

Panggilan yang sama dengan request api/postman/etc berfungsi.

Serius meskipun ... harus menjadi cara yang lebih baik (dalam aksioma)

@iyerusad Apakah Anda menemukan cara yang lebih baik daripada solusi Anda? Saya menghadapi masalah yang sama, dan membuat frustrasi karena saya tampaknya tidak dapat mencegat pengalihan dan menghapus header Otorisasi hanya untuk permintaan tindak lanjut/pengalihan (ke amazon dalam kasus ini)

@iyerusad Apakah Anda menemukan cara yang lebih baik daripada solusi Anda? Saya menghadapi masalah yang sama, dan membuat frustrasi karena saya tampaknya tidak dapat mencegat pengalihan dan menghapus header Otorisasi hanya untuk permintaan tindak lanjut/pengalihan (ke amazon dalam kasus ini)

Tidak juga - menggunakan opsi B. dari bawah.

_Opsi yang saya evaluasi:_
A. Mengadopsi pembungkus/klien alternatif (mis. fetch api? request? request tampaknya berhasil tetapi tampaknya tidak digunakan lagi). Ini mungkin opsi terbersih tetapi berarti beralih ke sintaks klien http lain.

B. Bungkus solusi saya menjadi sebuah fungsi dan gunakan fungsi itu untuk permintaan yang saya tahu mengalami masalah ini - tampaknya kurang efisien tetapi menggunakan ini saat ini.

C. Semoga saya idiot dan menggunakan axios salah dan ada solusi yang lebih waras dengan axios.

D. Axios mendapatkan perbaikan/tambalan?

@mikhoq @iyerusad Maukah Anda membuka edisi baru untuk melacak masalah Anda? Karena berbeda dengan yang sekarang, yang mungkin sudah diperbaiki di #2844.

Tidak masalah - Dibuka #2855.

@mikhoq tolong tambahkan komentar di sana jika Anda memiliki titik akhir repro publik.

Jadi ternyata transformRequest dipanggil untuk permintaan GET ? Saya mencoba ini dan berhasil, itu hanya menghapus header untuk permintaan saat ini.

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

Tapi kata dokter

// transformRequest memungkinkan perubahan pada data permintaan sebelum dikirim ke server
// Ini hanya berlaku untuk metode permintaan 'PUT', 'POST', 'PATCH' dan 'DELETE'

Yang membuat saya berpikir transformRequest tidak akan dipanggil untuk permintaan GET , tetapi memang demikian. Jadi apa sebenarnya arti garis ini?

"Ini hanya berlaku untuk metode permintaan 'PUT', 'POST', 'PATCH' dan 'DELETE'"

Mungkin, "Ini berpotensi hanya berguna untuk ...." ....? Itu menyesatkan om.

ini bekerja:
header: {
'tipe konten': 'aplikasi/json',
'Otorisasi': nol,
}

Mencoba mengatur { headers: { 'Content-Type' = null } } tanpa hasil,
jadi untuk menambahkan komentar bermanfaat @axelgenus , saya harus melangkah lebih jauh:

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']
// ...

Kasus penggunaan mengimplementasikan lapisan permintaan untuk metode otentikasi Bitstamp API V2 .

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

achingbrain picture achingbrain  ·  3Komentar

altruisticsoftware picture altruisticsoftware  ·  3Komentar

Adman picture Adman  ·  3Komentar

c0debreaker picture c0debreaker  ·  3Komentar

ildella picture ildella  ·  3Komentar