Hai,
Saya mencoba menggunakan API Database Komposisi Makanan USDA untuk mengakses informasi nutrisi. Saya ingin memasukkan permintaan get berikut menggunakan objek axios config.params:
Ini kode saya untuk permintaan axios.get:
axios.get('https://api.nal.usda.gov/ndb/nutrients/', {
params: {
format: 'json',
api_key: 'DEMO_KEY',
nutrients: [
205,
204,
208,
269
]
}
})
.then(response => console.log(response))
.catch(error => console.log(error))
Tetapi ketika saya mendapatkan respons, saya melihat bahwa url yang dibangun menjadi:
https://api.nal.usda.gov/ndb/nutrients/?format=json&api_key=DEMO_KEY&nutrients []=205&nutrients[]=204&nutrients[]=208&nutrients[]=269
Apakah ini dimaksudkan untuk terjadi? Apakah API lain mematuhi format ini? Jika demikian, apakah ada cara untuk menghindari penyisipan '[]' setelah setiap parameter 'nutrisi', sehingga saya dapat mengatasi masalah ini untuk API khusus ini?
Menurut tes ini tampaknya perilaku yang diharapkan.
Untuk menyiasatinya, Anda mungkin dapat menggunakan metode "paramsSerializer".
Saya akan memeriksanya, terima kasih.
Hai @stsourlidakis , Saya mencoba menggunakan paramsSerializer
untuk delete
metode di front-end, params bisa berupa array, tetapi saya tidak bisa mendapatkan params
di belakang -akhir.
Aku menyiapkan:
//front-end
axios.delete(url,
{paramsSerializer: accountsInfo } //--> paramsSerializer
).then(
(res) => {
.....
}
)
Lingkungan back-end saya adalah node
dan koa2
, untuk metode GET
, saya bisa mendapatkan params
seperti:
//front-end
axios.delete(`url/${array}`).then(
(res) => {...}
)
//back-end
handleDelete = async(ctx, next) => {
let arrayString = ctx.params.array;
}
jika saya menggunakan PUT
, PATCH
atau PATCH
, saya bisa mendapatkan data dari body:
//front-end
axios.patch(url, data).then(
(res) => {...}
)
//back-end
handlePatch = async(ctx, next) => {
let data = ctx.request.body.data;
...
}
Jadi saya bisa mendapatkan params
seperti di atas, tetapi tidak DELETE
. Saya juga mencoba qs
, namun tidak berhasil juga..
ada tips tentang itu?
Terima kasih
ini harus membantu
var qs = require('qs');
axios.get('api/', {
'params': {'country': ['PL', 'RU']}
'paramsSerializer': function(params) {
return qs.stringify(params, {arrayFormat: 'repeat'})
},
})
Terima kasih @kmmbvnr , tapi saya lebih suka ini adalah perilaku
PS:
Saya akhirnya menemukan bahwa ini bukan masalah, saya tidak perlu menggunakan paramsSerializer
, karena saya dapat dengan mudah mendapatkan params dari backend(Spring Boot) seperti ini:
@GetMapping()
public String search(@RequestParam(name = "country[]") String[] country)
const transformRequestOptions = params => {
let options = '';
for (const key in params) {
if (typeof params[key] !== 'object' && params[key]) {
options += `${key}=${params[key]}&`;
} else if (typeof params[key] === 'object' && params[key] && params[key].length) {
params[key].forEach(el => {
options += `${key}=${el}&`;
});
}
}
return options ? options.slice(0, -1) : options;
};
dan
axios.get('api/', {
params: {'country': ['PL', 'RU']},
paramsSerializer: params => transformRequestOptions(params)
})
dapatkan opsi url/country=PL&country=RU
Memfaktorkan ulang jawaban @AndreyPatseiko untuk gaya ES6+:
const parseParams = (params) => {
const keys = Object.keys(params);
let options = '';
keys.forEach((key) => {
const isParamTypeObject = typeof params[key] === 'object';
const isParamTypeArray = isParamTypeObject && (params[key].length >= 0);
if (!isParamTypeObject) {
options += `${key}=${params[key]}&`;
}
if (isParamTypeObject && isParamTypeArray) {
params[key].forEach((element) => {
options += `${key}=${element}&`;
});
}
});
return options ? options.slice(0, -1) : options;
};
dan
axios.get('api/', {
'params': {'country': ['PL', 'RU'], 'nacionality': 'FOO' } // result: country=PL&country=RU&nacionality=FOO
'paramsSerializer': params => parseParams(params)
});
BTW, terima kasih, @AndreyPatseiko! Jawaban Anda sangat membantu saya!
Ini lebih baik
axios.get('api/foo...', {
params: {arr: [1, 2] + ' ' }
)}
@jorge683 yang menghasilkan kueri yang salah nutrients=205,204,208,269
Komentar yang paling membantu
ini harus membantu