Axios: Menyediakan array sebagai param tidak berfungsi seperti yang diharapkan.

Dibuat pada 16 Des 2016  ·  9Komentar  ·  Sumber: axios/axios

Hai,
Saya mencoba menggunakan API Database Komposisi Makanan USDA untuk mengakses informasi nutrisi. Saya ingin memasukkan permintaan get berikut menggunakan objek axios config.params:

https://api.nal.usda.gov/ndb/nutrients/?format=json&api_key=DEMO_KEY&nutrients=205&nutrients=204&nutrients=208&nutrients=269

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?

Komentar yang paling membantu

ini harus membantu

var qs = require('qs');

axios.get('api/', {
    'params': {'country': ['PL', 'RU']}
    'paramsSerializer': function(params) {
       return qs.stringify(params, {arrayFormat: 'repeat'})
    },
})

Semua 9 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat