我的角度应用程序正在通过ui-router解析来调用我的API:
...
$stateProvider
.state('gallery',{
abstract: true,
templateUrl: 'components/gallery/gallery.html'
})
.state('gallery.views', {
url: "/{gallery:shades-of-gray|color}",
views: {
'left@gallery': {
templateUrl: 'components/gallery/partials/gallery-slider.html',
controller: 'SliderController'
},
'right@gallery': {
templateUrl: 'components/gallery/partials/gallery-img.html',
controller: 'GalleryImgController'
}
},
resolve: {
apiFactory: 'apiFactory',
drawings: function(apiFactory, $stateParams){
var param = $stateParams.gallery === 'color' ? 'color' : 'bw';
return apiFactory.getImageUrls(param);
}
}
});
...
我的ApiFactory只是进行API调用并解决了这个承诺:
apiFactory.getImageUrls = function(gallery){
if (gallery === undefined)
var gallery = 'all';
return $http({
method: 'GET',
url: API_URL + '/drawings/' + gallery,
}).then(function(response){
return response.data.gallery;
});
};
我的两个控制器使用我的决心注入的数据:
.controller('SliderController', function($scope, drawings){
$scope.drawings = drawings;
...
}
controller('GalleryImgController', function($scope, drawings){
$scope.currentDrawing = drawings[0];
...
}
在Safari中,我等待 120秒以使$http
承诺得到解决,此时我会看到我的回复,其中包含正确的状态代码,标题等。但是(与Chrome中的Firefox不同) ,response.data
是一个包含HTTP标头的字符串:
我无法可靠地解析它(因为我会有一个带有一些响应的Authorization
标头)。是什么赋予了?为什么这是Safari的问题,我该怎么办?
如果有帮助,这里是响应请求的Express代码:
...
getDrawingSet(gallery, (err, drawings) => {
if (err)
return next(err);
let ret = {};
ret["gallery"] = drawings;
res.status(httpStatus[200]).json(ret);
});
...
其中drawings
只是一个JSON对象数组。谢谢。
答案 0 :(得分:1)
在Safari中,我等待 120秒以获取要解析的$ http承诺 哪一点我看到我的回复与正确的状态代码,标题等。 但是(与Chrome中的Firefox不同),
response.data
是一个字符串 包含HTTP标头:
HTTP/1.1 OK unknown
- >这不是有效的HTTP response header。
6.1状态行
响应消息的第一行是状态行,由...组成 协议版本后跟一个数字状态代码及其 相关的文本短语,每个元素由SP分隔 字符。除最终的CRLF序列外,不允许使用CR或LF。
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
应该是:
HTTP/1.1 200 OK
也许Safari不接受此标题并将标题数据推送到响应中?或者你之前收到其他标题?
答案 1 :(得分:0)
问题出现在服务器上(显然)。
我只是改变了以下行:
res.sendStatus(200).json(ret);
到
res.status(200).json(ret);
哪些可以简化为res.json(ret)
。
来自res.sendStatus()
的{{3}}:
将响应HTTP状态代码设置为statusCode
,并将其字符串表示形式作为响应正文发送。
将此与res.status()
:
使用此方法设置响应的HTTP状态。
我以为我是用前者做后者的。然而,Firefox和Chrome让我可以逃脱这一点我并不完全确定,但我很高兴Safari将此错误引起了我的注意。