使用Angular中的MessagePack

使用MessagePack库的网址是https://github.com/uupaa/msgpack.js。

angular.module('ngMsgpack', []).config(function($provide, $httpProvider) {

  // リクエストするときに余計なことをさせないようにする&オブジェクトはmessagepack形式に変換
  $httpProvider.transformRequest = [function(data) {
    switch (Object.prototype.toString(data)) {
      case '[object Uint8Array]':
      case '[object Int8Array]':
      case '[object Uint16Array]':
      case '[object Int16Array]':
      case '[object Uint32Array]':
      case '[object Int32Array]':
      case '[object Float32Array]':
      case '[object Float64Array]':
      case '[object CanvasPixelArray]':
      case '[object Uint8ClampedArray]':
      case '[object File]':
      case '[object Blob]':
        return data;
    }
    if (data !== null && typeof data === 'object') {
      return msgpack.pack(data);
    } else {
      return data;
    }
  }];

  // $httpBackendをラップ
  $provide.decorator('$httpBackend', function($delegate) {
    return function $httpBackend(method, url, post, callback, headers, timeout, withCredentials, responseType) {
      var xhr = new XMLHttpRequest;
      xhr.open(method, url);
      xhr.responseType = 'arraybuffer';
      angular.forEach(headers, function(v, k) {
        if (angular.isDefined(v)) {
          xhr.setRequestHeader(k, v);
        }
      });
      xhr.onloadend = function() {
        var responseHeaders = xhr.getAllResponseHeaders();

        if (xhr.status === 200) {
          callback(xhr.status, msgpack.unpack(new Uint8Array(xhr.response)), responseHeaders);
        } else {
          callback(xhr.status, null, responseHeaders);
        }
      };
      xhr.send(post || null);
    }
  });

});

使用时请像往常一样这样做。

angular.module('foo', ['ngMsgpack']).controller(function($scope, $http) {
  $http({
    method: 'POST',
    url: '/foo',
    data: {
      a: 1,
      b: 'bar'
    }
  }).success(...);
});
广告
将在 10 秒后关闭
bannerAds