Мое угловое приложение делает вызов моего 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:
Я не могу правильно его разобрать (потому что у меня будет заголовок 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. Благодарю.
Проблема была на сервере (очевидно).
Я просто изменил следующую строку:
res.sendStatus(200).json(ret);
в
res.status(200).json(ret);
Который действительно может быть упрощен для res.json(ret)
.
Из документов Express для res.sendStatus()
:
Установите код ответа HTTP-ответа в statusCode
и отправьте его строковое представление в качестве тела ответа.
Сравните это с res.status()
:
Используйте этот метод для установки статуса HTTP для ответа.
Я думал, что я делаю последнее с первым. Однако Firefox и Chrome позволили мне уйти от этого, я не совсем уверен, но я, конечно, счастлив, что Safari довел эту ошибку до моего внимания.
В 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 не принимает это как заголовок и подталкивает данные заголовка к ответу? Или вы получаете другие заголовки до этого?