【问题标题】:How to loop rest requests based on header response如何根据标头响应循环休息请求
【发布时间】:2019-03-07 22:30:55
【问题描述】:

我正在从 AZURE 资源加载信息(总共有大约 3700 条记录,包含 10 个属性)。响应提供了一个标头 (x-ms-continuation: {"token":"-RID:R-UdANZutGzxAwAAAAAAA==#RT:1#TRC:1000","range":{"min":"","max ":"FF"}}) 表示要加载更多项目 + 标头必须添加到下一个请求,以便检索下一个 1000 条记录。数据应存储在变量(帐户)中,因此仅在加载应用程序时获取一次数据。

在页面初始化函数: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);
                });
        });
    }
}

这是来自 AZURE API 文档的 Curl 参考 @ECHO 关闭

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 Api 端点文档的链接。
  • 嗨@fridoo 我更新了描述。感谢您的支持!
  • 为什么没有链接?我正在寻找有关返回类型、标头等的文档...

标签: angular rest api


【解决方案1】:

您必须指定 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), []),
    );
}

【讨论】:

  • 有一个问题:而不是 expand(accountsResponse => { const nextToken = accounts.headers.get('x-ms-continuation'); 我用的是: expand(accountsResponse => { const nextToken = accountsResponse .headers.get('x-ms-continuation'); 感谢您的支持!
  • 感谢您的通知,这是一个错字。
猜你喜欢
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多