Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何强制jQueryAjax序列化数据_Javascript_Jquery_Ajax_Serialization_Hmac - Fatal编程技术网

Javascript 如何强制jQueryAjax序列化数据

Javascript 如何强制jQueryAjax序列化数据,javascript,jquery,ajax,serialization,hmac,Javascript,Jquery,Ajax,Serialization,Hmac,问题:如何强制jQueryAjax序列化数据 jQuery Ajax“数据”可以是三种数据类型中的任意一种: 类型:纯对象、字符串或数组 要发送到服务器的数据。如果需要,它将转换为查询字符串 还不是字符串。它被附加到GET请求的url。看见 processData选项以阻止此自动处理。对象必须 必须是键/值对。如果值是数组,jQuery将序列化多个 基于传统设置值的具有相同键的值 如下所述 我相信,当jQuery.ajax处理/序列化/urlencode数据时,它会合并ajaxSetup中设置的

问题:如何强制jQueryAjax序列化数据

jQuery Ajax“数据”可以是三种数据类型中的任意一种:

类型:纯对象、字符串或数组

要发送到服务器的数据。如果需要,它将转换为查询字符串 还不是字符串。它被附加到GET请求的url。看见 processData选项以阻止此自动处理。对象必须 必须是键/值对。如果值是数组,jQuery将序列化多个 基于传统设置值的具有相同键的值 如下所述

我相信,当jQuery.ajax处理/序列化/urlencode数据时,它会合并ajaxSetup中设置的参数。但是,在到达beforeSend钩子之前,它似乎不会这样做

会吐出类似于:

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);
    }
});