Заголовки HTTP в данных ответа с сервера Express в Safari

0

Мое угловое приложение делает вызов моего API с разрешения ui-router:

...
$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 для решения, после чего я вижу свой ответ с соответствующим кодом состояния, заголовками и т.д. Однако (в отличие от Firefox в Chrome) response.data - это строка, содержащая заголовки HTTP:

Изображение 174551

Я не могу правильно его разобрать (потому что у меня будет заголовок 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
    Не решение вашей проблемы, но в вашем методе apiFactory.getImageUrls вы можете убить этот обработчик успеха ... код: ".then (function (response) {return response.data.gallery;});" ничего не делает, просто возвращает данные ответа закрытию $ http.
Теги:
http
safari

2 ответа

0
Лучший ответ

Решение

Проблема была на сервере (очевидно).

Я просто изменил следующую строку:

res.sendStatus(200).json(ret);

в

res.status(200).json(ret);

Который действительно может быть упрощен для res.json(ret).

Из документов Express для res.sendStatus():

Установите код ответа HTTP-ответа в statusCode и отправьте его строковое представление в качестве тела ответа.

Сравните это с res.status():

Используйте этот метод для установки статуса HTTP для ответа.

Я думал, что я делаю последнее с первым. Однако Firefox и Chrome позволили мне уйти от этого, я не совсем уверен, но я, конечно, счастлив, что Safari довел эту ошибку до моего внимания.

1

В Safari я жду 120 секунд для обещания $ http для решения, после чего я вижу свой ответ с соответствующим кодом состояния, заголовками и т.д. Однако (в отличие от Firefox в Chrome) response.data - это строка, содержащая заголовки HTTP:

HTTP/1.1 OK unknown

→ Это недопустимый заголовок ответа HTTP.

6.1 Строка состояния

Первая строка сообщения "Ответ" - это строка состояния, состоящая из версии протокола, за которой следует числовой код состояния и связанная с ним текстовая фраза, причем каждый элемент разделяется символами SP. Никакой CR или LF не допускается, за исключением окончательной последовательности CRLF.

   Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Должно быть:

HTTP/1.1 200 OK

Может быть, Safari не принимает это как заголовок и подталкивает данные заголовка к ответу? Или вы получаете другие заголовки до этого?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню