Javascript 如何强制jQueryAjax序列化数据
问题:如何强制jQueryAjax序列化数据 jQuery Ajax“数据”可以是三种数据类型中的任意一种: 类型:纯对象、字符串或数组 要发送到服务器的数据。如果需要,它将转换为查询字符串 还不是字符串。它被附加到GET请求的url。看见 processData选项以阻止此自动处理。对象必须 必须是键/值对。如果值是数组,jQuery将序列化多个 基于传统设置值的具有相同键的值 如下所述 我相信,当jQuery.ajax处理/序列化/urlencode数据时,它会合并ajaxSetup中设置的参数。但是,在到达beforeSend钩子之前,它似乎不会这样做 会吐出类似于:Javascript 如何强制jQueryAjax序列化数据,javascript,jquery,ajax,serialization,hmac,Javascript,Jquery,Ajax,Serialization,Hmac,问题:如何强制jQueryAjax序列化数据 jQuery Ajax“数据”可以是三种数据类型中的任意一种: 类型:纯对象、字符串或数组 要发送到服务器的数据。如果需要,它将转换为查询字符串 还不是字符串。它被附加到GET请求的url。看见 processData选项以阻止此自动处理。对象必须 必须是键/值对。如果值是数组,jQuery将序列化多个 基于传统设置值的具有相同键的值 如下所述 我相信,当jQuery.ajax处理/序列化/urlencode数据时,它会合并ajaxSetup中设置的
timestamp=1404768761739&utf8=%E2%9C%93&_method=put&authenticity_token=EsRpMWMOaQAxJ6XgNJKyh8Yj7WUvkaSkC7n0MmVvjZM%3D&dropdown=true&id=597&name=raise_head&number=0
或
这完全取决于ajax在应用程序中的使用方式,是显式使用$.ajax,还是通过backbone.js,还是劫持表单提交
再次问:如何强制jQueryAjax序列化数据
为什么背景:
整个应用程序需要使用HMAC-SHA256签署所有请求
jQuery ->
$.ajaxSetup(
data:
timestamp: +new Date
statusCode:
401: (data) ->
alert( "ERROR #839.0: Access Denied" )
console.log data.responseText
beforeSend: (xhr, settings) ->
xhr.setRequestHeader('x-api-key', SLNAK)
# Type of request?
if settings.type == 'GET'
# At minimum the timestamp param has been set.
if match = settings.url.match(/\?(.*)/)
hmac = CryptoJS.HmacSHA256(match[1], SLNAS).toString(CryptoJS.enc.Base64)
xhr.setRequestHeader('x-api-hmac', hmac)
else
alert('ERROR #839.1: Encryption was not able to calculate.')
#location.reload();
else
# la pôsté
if settings.data && settings.data.length > 0
hmac = CryptoJS.HmacSHA256(settings.data, SLNAS).toString(CryptoJS.enc.Base64)
xhr.setRequestHeader('x-api-hmac', hmac)
else
alert('ERROR #839.2: Encryption was not able to calculate.')
#location.reload();
)
您可以始终在发送前检查数据是否为对象,并在使用前自行序列化数据 这是一个比在beforeSend中使用更好的函数,它将匹配任何数据类型,并将序列化post或put请求中的任何对象
$.ajaxPrefilter(function (options, org) {
var rtype = options.type.toLowerCase();
if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
options.data = JSON.stringify(org.data);
}
});
希望这有帮助事实上,我认为您可能在jQuery转换和发送数据之前看到了它,您在实际服务器上看到了这些不同的格式吗?
jQuery ->
$.ajaxSetup(
data:
timestamp: +new Date
statusCode:
401: (data) ->
alert( "ERROR #839.0: Access Denied" )
console.log data.responseText
beforeSend: (xhr, settings) ->
xhr.setRequestHeader('x-api-key', SLNAK)
# Type of request?
if settings.type == 'GET'
# At minimum the timestamp param has been set.
if match = settings.url.match(/\?(.*)/)
hmac = CryptoJS.HmacSHA256(match[1], SLNAS).toString(CryptoJS.enc.Base64)
xhr.setRequestHeader('x-api-hmac', hmac)
else
alert('ERROR #839.1: Encryption was not able to calculate.')
#location.reload();
else
# la pôsté
if settings.data && settings.data.length > 0
hmac = CryptoJS.HmacSHA256(settings.data, SLNAS).toString(CryptoJS.enc.Base64)
xhr.setRequestHeader('x-api-hmac', hmac)
else
alert('ERROR #839.2: Encryption was not able to calculate.')
#location.reload();
)
if( typeof settings.data === 'object' ){
settings.data = $.param( settings.data ) ;
}
$.ajaxPrefilter(function (options, org) {
var rtype = options.type.toLowerCase();
if ((rtype === "post" || rtype === "put") && org.data !== null && typeof org.data === 'object') {
options.data = JSON.stringify(org.data);
}
});