Угловая опция HTTP GET возвращает 403 для файлов S3 json - PullRequest
0 голосов
/ 04 ноября 2019

Я пытаюсь получить файлы перевода из S3, но получаю код ошибки 403 от AWS.

Я использую библиотеку ngx-Translate для перевода веб-сайта, я реализовалмой собственный пользовательский переводчик. но я все еще получаю 403 при опции получения (и насколько мне известно, это запрос chrome)

import { Injectable } from '@angular/core';
import { TranslateLoader } from '@ngx-translate/core';
import { Observable } from 'rxjs';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { environment } from 'src/environments/environment';

@Injectable()
export class HttpTranslateLoaderService implements TranslateLoader {
    contentHeader = new HttpHeaders({ "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });

    constructor(private http: HttpClient) { }
    getTranslation(lang: string): Observable<any> {
        var apiAddress = environment.bucketUrl + "mobile/assets/i18n/" + lang + ".json";
        return Observable.create(observer => {
            this.http.get(apiAddress, { headers: this.contentHeader }).subscribe((res: Response) => {
                observer.next(res.json());
                observer.complete();
            },
                error => {
                    //  failed to retrieve from api, switch to local
                    this.http.get(`/assets/i18n/${lang}.json`).subscribe((res: Response) => {
                        observer.next(res.json());
                        observer.complete();
                    })
                }
            );
        });
    }
}

Все проблемы с разрешениями AWS были проверены

Я ожидаю получить файл, который имеетобщедоступный, но все равно получаю запрещенную ошибку

1 Ответ

0 голосов
/ 04 ноября 2019

В конце концов я решил проблему!

Я не знаю, правильный ли это путь, но он работает для меня.

Вместо использования углового httpсервис, я использовал встроенную функцию извлечения и окружения с помощью функции rxjs.

Обновлен загрузчик перевода

import { Injectable } from '@angular/core';
import { TranslateLoader } from '@ngx-translate/core';
import { Observable, of, from } from 'rxjs';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { environment } from 'src/environments/environment';

@Injectable()
export class HttpTranslateLoaderService implements TranslateLoader {
    contentHeader = new HttpHeaders({ "Content-Type": "application/json", "Access-Control-Allow-Origin": "*" });
    httpParams = new HttpParams().set('cacheblock', 'true')
    constructor(private http: HttpClient) { }
    getTranslation(lang: string): Observable<any> {
        var apiAddress = environment.bucketUrl + "mobile/assets/i18n/" + lang + ".json";
        return Observable.create(observer => {
            from(fetch(apiAddress)).subscribe((res: Response) => {
                observer.next(res.json());
                observer.complete();
            },
                error => {
                    //  failed to retrieve from api, switch to local
                    this.http.get(`/assets/i18n/${lang}.json`).subscribe((res: Response) => {
                        observer.next(res.json());
                        observer.complete();
                    })
                }
            );
        });
    }
}
...