Para agregar parámetros de consulta a una URL usando jQuery AJAX, haga esto:
$.ajax({ url: 'www.some.url', method: 'GET', data: { param1: 'val1' } )} Lo que da como resultado una URL como www.some.url?param1=val1
¿Cómo hago lo mismo cuando el método es POST? Cuando ese es el caso, data ya no se agregan como parámetros de consulta, sino que forman el cuerpo de la solicitud.
Sé que podría agregar manualmente los parámetros a la URL antes de la solicitud ajax, pero tengo la molesta sensación de que me falta una forma obvia de hacerlo que sea más corta que las ~ 5 líneas que necesitaré para ejecutar antes de la llamada ajax.
jQuery.param() le permite serializar las propiedades de un objeto como una cadena de consulta, que usted mismo podría agregar a la URL:
$.ajax({ url: 'http://www.example.com?' + $.param({ paramInQuery: 1 }), method: 'POST', data: { paramInBody: 2 } });Gracias @Ates Goral por la sugerencia de jQuery.ajaxPrefilter() . Mi problema era que no podía cambiar la url porque estaba vinculada a kendoGrid y la API web de back-end no admitía las opciones de paginación del servidor de kendoGrid (es decir, page , pageSize de página, skip y take ). Además, las opciones de paginación de back-end tenían que ser parámetros de consulta con un nombre diferente. Entonces tuve que poner una propiedad en los data para activar el prefiltrado.
var grid = $('#grid').kendoGrid({ // options here... dataSource: { transport: { read: { url: url, contentType: 'application/json', dataType: 'json', type: httpRequestType, beforeSend: authentication.beforeSend, data: function(data) { // added preFilterMe property if (httpRequestType === 'POST') { return { preFilterMe: true, parameters: parameters, page: data.page, itemsPerPage: data.pageSize, }; } return { page: data.page, itemsPerPage: data.pageSize, }; }, }, }, }, }); Como puede ver, las opciones de transport.read son las mismas opciones para jQuery.ajax() . Y en el bit de prefiltrado:
$.ajaxPrefilter(function(options, originalOptions, xhr) { // only mess with POST request as GET requests automatically // put the data as query parameters if (originalOptions.type === 'POST' && originalOptions.data.preFilterMe) { options.url = options.url + '?page=' + originalOptions.data.page + '&itemsPerPage=' + originalOptions.data.itemsPerPage; if (originalOptions.data.parameters.length > 0) { options.data = JSON.stringify(originalOptions.data.parameters); } } });