Как зациклить запросы отдыха на основе ответа заголовка - PullRequest
0 голосов
/ 19 февраля 2019

Я загружаю информацию из ресурса AZURE (всего около 3700 записей с 10 атрибутами).Ответ содержит заголовок (x-ms-продолжение: {"token": "- RID: R-UdANZutGzxAwAAAAAAAA == # RT: 1 # TRC: 1000", "range": {"min": "", "max":" FF "}}) указывает на то, что должно быть загружено больше элементов + заголовок должен быть добавлен к следующему запросу, чтобы получить следующие 1000 записей.Данные должны храниться в переменной (account), поэтому данные загружаются только один раз при загрузке приложения.

При инициализации страницы функция: public getAccounts () запускает функцию load (), которая возвращает первые 1000 записей.и сохраняет их на счетах.В закомментированном разделе есть fetchAccounts, где я пытался заставить это работать.

export class AccountsService {

    private accounts: AccountModel = null;

    constructor(private http: HttpClient) { }

/*     public getAccounts2() {
      console.log(this.accounts);
      return this.accounts;
    }

    loadAccounts() {
      this.fetchAccounts().subscribe(accounts => this.accounts.next(accounts));
    }

    public fetchAccounts(): Observable<AccountModel[]> {
      return this.http.get<AccountModel>(AZURE_URL + 'zuora/read', { headers })
        .pipe(
          expand(accounts => {
            if (!accounts) {
              console.log(accounts.headers.get('x-ms-continuation'));
              return EMPTY;
            }
            return this.http.get<AccountModel>(AZURE_URL + 'zuora/read', { headers });
          }),
          map(accounts => accounts.Documents),
          reduce((accData, data) => accData.concat(data), []),
        );
    } */

    public getAccounts(): AccountModel {
        return this.accounts;
    }

    load() {
        console.log('loading account data');
        return new Promise((resolve, reject) => {
            this.http
                .post<any>(AZURE_URL + 'zuora/read', {
                  'query': 'SELECT * FROM products'
                  }
                  , { headers })
                  .pipe(map(data => data))
                  .subscribe(data => {
                    this.accounts = data;
                    console.log('data loading complete');
                    resolve(true);
                });
        });
    }
}

Это ссылка на Curl из документации API AZURE @ECHO OFF

curl -v -X POST "https://jangoepelapitest.azure-api.net/zuora/read"
-H "Ocp-Apim-Subscription-Key: {subscription key}"

--data-ascii "{body}" 

Это APIОпределение:

{
  "openapi": "3.0.1",
  "info": {
    "title": "cosmos zuora",
    "description": "",
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://xxxxxxx.azure-api.net/zuora"
    }
  ],
  "paths": {
    "/read": {
      "post": {
        "summary": "Read",
        "description": "query accounts",
        "operationId": "5c1a4f71153ff8904fd4106a",
        "requestBody": {
          "content": { }
        },
        "responses": { }
      }
    },
    "/write": {
      "post": {
        "summary": "write",
        "description": "query accounts",
        "operationId": "5c1b45759ba2ebb7bba2c13d",
        "requestBody": {
          "content": { }
        },
        "responses": { }
      }
    },
    "/copy-5c1b6-of-/read": {
      "post": {
        "summary": "Read (clone)",
        "description": "query accounts",
        "operationId": "5c1b6b9feea787d74728b102",
        "requestBody": {
          "content": { }
        },
        "responses": { }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "apiKeyHeader": {
        "type": "apiKey",
        "name": "Ocp-Apim-Subscription-Key",
        "in": "header"
      },
      "apiKeyQuery": {
        "type": "apiKey",
        "name": "subscription-key",
        "in": "query"
      }
    }
  },
  "security": [
    {
      "apiKeyHeader": [ ]
    },
    {
      "apiKeyQuery": [ ]
    }
  ]
}

Все записи должны быть загружены из ресурса Azure и сохранены в учетных записях.

1 Ответ

0 голосов
/ 19 февраля 2019

Вы должны указать httpOption observe: 'response', чтобы получить полный ответ и прочитать заголовки.Затем проверьте, присутствует ли желаемое значение заголовка и установите необходимые значения заголовка для следующего запроса.

accounts = new Subject<AccountModel[]>();

loadAccounts() {
  this.fetchAccounts().subscribe(accounts => this.accounts.next(accounts));
}

public fetchAccounts(): Observable<AccountModel[]> {
  return this.http.get<AccountModel[]>(AZURE_URL + 'zuora/read', { headers, observe: 'response' })
    .pipe(
      expand(accountsResponse => {
        const nextToken = accountsResponse.headers.get('x-ms-continuation');
        console.log('Next token:', nextToken);
        if (nextToken === null) {             
          return EMPTY;
        }

        return this.http.get<AccountModel[]>(
          AZURE_URL + 'zuora/read', 
          { headers: headers.set('x-ms-continuation', nextToken), observe: 'response' }
        );
      }),
      map(accountsResponse => accountsResponse.body),
      reduce((accData, data) => accData.concat(data), []),
    );
}
...