Jika tajuk telah ditetapkan sebagai default, tampaknya tidak ada cara untuk melewatinya pada permintaan individual. Menyetel null
atau undefined
tidak menghasilkan apa-apa.
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.
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
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:
Saya mengalami situasi yang agak mirip tetapi dengan permintaan GET:
Authorization: Bearer mytoken
Pengalihan ke titik akhir AWS S3. URL pengalihan memiliki string kueri: X-Amz-Signature=blahblahblah
ditambahkan.
AWS S3 menolak panggilan karena dua Otentikasi:
Authorization bearer token
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.
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:
- DAPATKAN http://www.saasserviceprovider.com/notpublicapi dengan tajuk
Authorization: Bearer mytoken
- Pengalihan ke titik akhir AWS S3. URL pengalihan memiliki string kueri:
X-Amz-Signature=blahblahblah
ditambahkan.- 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 mempengaruhidelete 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 .
Komentar yang paling membantu
bekerja untuk saya