来自Safari中Express服务器的响应数据中的HTTP标头

时间:2016-01-03 00:05:00

标签: javascript angularjs http safari

我的角度应用程序正在通过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标头的字符串:

enter image description here

我无法可靠地解析它(因为我会有一个带有一些响应的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对象数组。谢谢。

2 个答案:

答案 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将此错误引起了我的注意。