2017-07-07 1 views
1

J'écris une application dans Angular 4 qui appelle une API REST (DJANGO). Le code est aussi suivi:Angular 4 Réponse de GET 403

export class ForecastUnitService { 

private path = 'forecastunit/'; 
private options; 
constructor (private http: Http, private c:CentralService) { 
this.options=this.c.createOptions(); 
} 

getForecastUnits(): Observable<ForecastUnit[]> { 
return this.http.get(this.c.createURL(this.path),this.options) 
    .map(this.extractData) 
    .catch(this.handleError); 
} 
... 
} 

ajouter des options qui contient un en-tête d'autorisation, mais je me 403 interdit. Cependant, quand j'essaie l'appel avec cUrl ou Postman ou avec swagger, avec le même jeton, j'obtiens des résultats. Alors d'abord tought, les en-têtes ne sont pas correctes, mais lorsque je me connecte les options je reçois:

{"method":null,"headers":{"Authorization":["**Correct Token**"],"Content-Type":["application/json"]},"body":null,"url":null,"withCredentials":null,"responseType":null} 

Donc ce n'est pas le problème, quand je regarde dans la réponse de Chrome que je vois ce qui suit:

{"detail":"Authentication credentials were not provided."} 

Donc encore une fois pas d'informations d'identification, mais je les ai vraiment passé, qu'est-ce qui ne va pas?

+0

quel est le format de votre jeton passé? – Aniket

+0

Basic 64, je suppose – fangio

+0

voulez savoir le format de jeton d'exemple que vous transmettez Autorisation – Aniket

Répondre

1

Le module http d'Angular change tous les noms d'en-tête en minuscules. Cela peut poser un problème car certains services d'API ne suivent pas la spécification et leurs vérifications d'en-tête sont sensibles à la casse lorsque celles-ci ne respectent pas la casse.

Vérifiez la configuration de votre API.

Je suppose que votre CentralService crée des options valides.

interface RequestOptionsArgs { 
    url: string|null 
    method: string|RequestMethod|null 
    search: string|URLSearchParams|{[key: string]: any | any[]}|null 
    params: string|URLSearchParams|{[key: string]: any | any[]}|null 
    headers: Headers|null 
    body: any 
    withCredentials: boolean|null 
    responseType: ResponseContentType|null 
} 

têtes:

class Headers { 
    static fromResponseHeaderString(headersString: string): Headers 
    constructor(headers?: Headers|{[name: string]: any}|null) 
    append(name: string, value: string): void 
    delete(name: string): void 
    forEach(fn: (values: string[], name: string|undefined, headers: Map<string, string[]>) => void): void 
    get(name: string): string|null 
    has(name: string): boolean 
    keys(): string[] 
    set(name: string, value: string|string[]): void 
    values(): string[][] 
    toJSON(): {[name: string]: any} 
    getAll(name: string): string[]|null 
    entries() 
} 
+0

Le deuxième codeblock dans ma question sont mes RequestOptions, ceux-ci me semblent corrects .. – fangio

+0

TypeScript devrait mettre en évidence les erreurs possibles si tout est correctement tapé dans votre service. Juste au cas où vérifier [RequestOptionsArgs] (https://angular.io/api/http/RequestOptionsArgs) dans les documents Angular. –

+0

Comment faire pour que les vérifications d'en-tête soient insensibles à la casse? Ou les en-têtes ne pas en minuscules dans Angular? – fangio

-1

Pourriez-vous nous montrer la CentralService? Aussi, vous pouvez éviter d'appeler dans le constructeur, à la place mettre en œuvre OnInit