今天我花了很长时间在谷歌搜索这个问题,我发现有几个地方人们提出了同样的问题,但从来没有得到过回应。
当我想在角度中使用$ http来获取(成功时)一个大的zip文件,pdf或图像时,我设置request.responseType =“arraybuffer”将其作为一个包来点。
问题在于不成功。如果我得到一个500,那么现在只有一个包的任何错误信息,这对用户来说并不好。
问题是如何使$ http获取以不同的方式处理结果,具体取决于请求是否成功。
我遇到了一些具有相同问题的StackOflow / github帖子。他们指出httpInterceptor的东西是 pre - 处理请求,但 post - 处理响应,并且转换内容在响应处理程序之前进入(所以结果已经转变了)。我找到了github线程,其中状态被添加到转换函数的参数列表中,但是这仍然让你自己实现所有其他行为。
我尝试了下面这个并且它有效,但它在我的嘴里留下了不好的味道。基本思想是使用拦截器的预先性质来请求在条件逻辑中包装默认响应变换,如下所示
/* httpInterceptor.request */
request: function (config) {
if (config.responseType == 'arraybuffer')
{
config.responseType = "";
config.transformResponse = conditionalArrayBufferTransform(config);
}
return config || $q.when(config);
},
....
function conditionalArrayBufferTransform(config)
{
var defaults = config.transformResponse;
defaults = angular.isArray(defaults) ? angular.copy(defaults) : [defaults];
var oldFunc = defaults[0]; // wrap the lead transform (whatever it is) with a closure that will set the responseType back if not an error
defaults[0] = function (data, headerGetter, status)
{
if (status != 500)
{
config.responseType = "arraybuffer";
}
return (typeof oldFunc === "function") ? oldFunc(data, headerGetter, status) : data;
}
return defaults;
}
令我惊讶的是,这产生了预期的结果 - 如果请求成功则需要一个包,如果请求不成功则“保留响应”。但它感觉有点像kludgy。
有没有人有更规范的建议?响应转换的签名不包括响应对象(或配置);只有较低的水平。