В настоящее время я разрабатываю угловое приложение с Java-бэкэндом. Пока что все работало, но теперь я столкнулся с необъяснимой проблемой. Есть один запрос GET, который не работает. Все остальное работает. Но как ни странно, в Firefox он не работает.
Когда я распечатываю ошибку наблюдаемого, это отображается в консоли:
{
"headers": {
"normalizedNames": {},
"lazyUpdate": null,
"headers": {}
},
"status": 0,
"statusText": "Unknown Error",
"url": null,
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for (unknown url): 0 Unknown Error",
"error": {
"isTrusted": true
}
}
Когда я смотрю на вкладке сети, запрос не выполняется. Даже предварительный запрос OPTIONS.
Я намекал на несколько подсказок, что у меня будет проблема с CORS. Но я считаю, что это не тот случай. Мои заголовки CORS настроены правильно:
Access-Control-Allow-Headers: X-Requested-With, Content-Type, Authorization
Access-Control-Allow-Methods: GET, POST, DELETE, PUT, OPTIONS, HEAD
Access-Control-Allow-Origin: *
Content-Type: application/json
(обычно я бы назначил более конкретный список доменов для заголовков CORS, но я установил его на '*', чтобы быть уверенным)
Запрос, который не работает, находится на ресурсе /ads/:id
.
Запрос на /ads
и все остальные запросы работают отлично.
Все ресурсы реализованы с Джерси. И данный запрос не подлежит какой-либо аутентификации или авторизации.
Напомним: только один запрос только в Firefox не работает.
Если я перейду к URL напрямую (не через angular), все будет нормально.
Я немного отчаялся здесь. Любая помощь приветствуется.
Для уточнения :
- в консоли разработчика нет ошибок или чего-то еще (ни в Firefox, ни в Chrome)
- нет запроса на выход из браузера во вкладке сети
- нет запроса на стороне сервера
- ошибка выше от
console.log(err)
- угловой v5.2.9 и HttpClient используются
Сужение проблемы
Мой полный URL-адрес http://localhost:8080/api/v1/ads/1
.
И угадайте, в чем проблема - часть /ads
.
Я понятия не имею, что именно вызывает это.
Я пробовал несколько других URL-адресов, таких как /ad
/adsf
/adsa
и т. Д., И все они работали.
Я также сузил Angular к этому:
import { Component, OnInit } from '@angular/core';
import { AdService } from '@app/shared/services/ad/ad.service';
import { HttpClient } from '@angular/common/http';
class Ad {
id: number;
title: string;
}
@Component({
selector: 'fwas-ad-detail',
template: `
<div *ngIf="isError">
<h1>Error</h1>
</div>
<div *ngIf="!isError">
<h1>{{ad?.title}}</h1>
</div>
`
})
export class AdDetailComponent implements OnInit {
url = 'http://localhost:8080/api/v1/ads';
ad: Ad;
isError = false;
constructor(private http: HttpClient) { }
ngOnInit() {
const queryUrl = this.url + '/' + '1';
this.http.get<Ad>(queryUrl).subscribe(
data => { this.ad = data; },
err => { this.isError = true; }
);
}
}
Я также попробовал это с json server , который работал нормально.
Таким образом, проблема существует только со следующим:
- угловой код 5 выше
- Firefox 59.0.3 (64-разрядная версия)
- Джерси2 / Джексон2 API
- и
/ads
в URL, но не как последняя часть (http://localhost:8080/api/v1/ads
всегда работал)
Я нашел обходной путь для меня (не используя рекламу в URL), но если кому-то скучно и он хочет это выяснить, я хотел бы знать, в чем именно причина этой тайны.