请求Headers.append无效

时间:2017-12-01 17:28:31

标签: javascript http jasmine karma-jasmine fetch

解决方案

我想发布实际修改后的代码和解决方案。我必须单独get Content-Type

const url = 'api/test';
const result = ApiRequestFactory.build(ApiRequestFactory.MusiQuestApiType, url);
const contentType = result.headers.get('Content-Type');

expect(result).not.toBeNull('The result is null.');
expect(result.url).toBe(urlJoin(config.MusiQuestApi.url, 'api/test'), 'The url is incorrect.');
expect(result.options).toBeFalsy('There is an options object and should not be.');
expect(result.credentials).toBe('omit', 'The credentials is not set to omit.');
expect(contentType).toBeTruthy('The Content-Type header is missing.');
expect(contentType).toBe('application/json', 'The Content-Type header is not set to application/json.');
expect(result.method).toBe('GET', 'The method is not set to GET.');
expect(result.mode).toBe('cors', 'The mode is not set to cors.');

环境

  • 测试赛跑者: Karma
  • 测试框架: Jasmine
  • 测试浏览器: Chrome
  • 获取Polyfill: isomorphic-fetch
  • ES6承诺图书馆: es6-promise

问题

在测试从defaultHeaders.values()返回的对象时,即使我append标题,我也会得到一个空对象。

代码

我有一个构建Request对象的类。您可以在下面看到它在构建对象时为header添加默认Content-Type

export default class MusiQuestApiRequest {
  static build(url, body, options) {
    const defaultCredentials = 'omit';

    let defaultHeaders = new Headers();
    defaultHeaders.append('Content-Type', 'application/json');

    const defaultMethod = 'GET';
    const defaultMode = 'cors';

    let init = {
      credentials: options.credentials || defaultCredentials,
      headers: options.headers || defaultHeaders,
      method: options.method || defaultMethod,
      mode: options.mode || defaultMode
    };

    if (body) {
      init.method = options.method || 'POST';
      init.body = JSON.stringify(body);
    }

    return new Request(url, init);
  }
}

但是当我检查Content-Type对象上的values属性时,我得到了未定义,因为返回的values对象是空的。

const url = 'api/test';
const result = ApiRequestFactory.build(ApiRequestFactory.MusiQuestApiType, url);
const headersResult = result.headers.values();
console.log('headersResult:', JSON.stringify(headersResult));

expect(result).not.toBeNull();
expect(result.url).toBe(urlJoin(config.MusiQuestApi.url, 'api/test'));
expect(result.options).toBeFalsy();
expect(result.credentials).toBe('omit');
expect(headersResult).toBeTruthy('headers missing');
expect(headersResult['Content-Type']).toBeTruthy('Content-Type missing');
expect(headersResult['Content-Type']).toBe('application/json');
expect(result.method).toBe('GET');
expect(result.mode).toBe('cors');

我在这里做错了什么?似乎很直接。

1 个答案:

答案 0 :(得分:1)

result.headers是一个Headers对象,与普通的JavaScript对象略有不同。要从headers对象中检索值,可以使用get函数。

例如:

myHeaders.get('foo')

或者,您可以使用values返回Iterator,这样您就可以使用for...of循环来提取值。

您可以找到更多信息here

希望这有帮助。