Как создать сервисы Aurelia без конфигурации избыточного заголовка?

В настоящее время я работаю над проектом, использующим Aurelia в качестве интерфейсной среды, и мне интересно, есть ли более красноречивый и менее избыточный способ установки заголовка запроса в моих службах API. Ниже приведен пример.

В этом Post сервис, я создал configureHeaders метод, который я вызываю перед каждым вызовом API, потому что в противном случае я сталкиваюсь со случаем, когда веб-токен изменился, но заголовок запроса не обновился. При создании этого configureHeaders метод - это функциональный обходной путь, я должен сделать это для каждого из моих сервисов, и он чувствует себя очень излишним.

Есть ли способ настроить заголовок запроса в масштабах приложения, чтобы мне не нужно было создавать configureHeaders метод для каждой услуги и вызывать его для каждого запроса?

import {inject} from 'aurelia-framework';
import {HttpClient} from 'aurelia-http-client';

import environment from 'environment';

@inject(HttpClient)
export class Post {

    constructor(http) {
        this.http = http;
    }

    configureHeaders() {
        this.token = window.localStorage.getItem('token') || null;
        this.http = this.http
          .configure(x => {
            x.withBaseUrl(environment.serverBaseURL);
            x.withHeader('Authorization', `Bearer ${this.token}`);
          });       
    }

    getPosts() {
        this.configureHeaders();

        return this.http.get('post')    
        .then(posts => {
            return JSON.parse(posts.response);
        });
    }

}

1 ответ

Решение

Как отметил Р.Ричардс, HttpClient Interceptor от Aurelia - это то, что вам нужно.

Вот пример класса - в отличие от объекта с анонимными функциями

1.) Объявить перехватчик

import {Interceptor, HttpResponseMessage, RequestMessage} from 'aurelia-http-client'

export class CustomInterceptor implements Interceptor {
  request(request: RequestMessage): RequestMessage {
    //Do request interceptor here
    return request;
  }
  response(response: HttpResponseMessage): HttpResponseMessage{
    //Do response interception here
    return response;
  }
}

2.) Зарегистрируйте перехватчик как часть вашего http-клиента по умолчанию в вашем main.js

import {CustomInterceptor} from 'path/to/custom-interceptor'

...
...

http.configure(config => {
  //config stuff here
).withInterceptor(new CustomInterceptor())

Это должно соответствовать вашему красноречию!

Другие вопросы по тегам