angularjs - Angular 2 http header 似乎生成或发送不正确

标签 angularjs http header angular angular2-services

我正在尝试向使用 HTTP Basic auth 进行身份验证的后端发送请求。 用于测试目的

username: user
password: password

所以正确的标题是:

Authorization: Basic dXNlcjpwYXNzd29yZA==

我已经在 Chrome Advanced Rest Extension 中用这个 header 测试了请求并且它有效:

enter image description here

我在 Angular2 中生成的请求是这样的:

  public getCurrentCounter() {
    console.log("Method getCurrentCounter() in CounterService called");

    var request = this.backendURL + "counter";
    var header = this.generateHeader(this.username, this.password);
    console.log(header);

    return this._http.get(request, {
      headers: header
    })
      .map(res => res.json());
  }

  /**
   * Generate HTTP header using HTTP basic Auth
   */
  private generateHeader(username, password) {

    var base64Creds = btoa(username + ":" + password);
    var auth = 'Basic ' + base64Creds;
    console.log(auth);
    var authHeader = new Headers();
    authHeader.append("Authorization", auth);

    return authHeader;
  }

我记录了生成的 header 对象,它看起来像这样:

enter image description here

我仍然得到这样的回应:

XMLHttpRequest cannot load http://localhost:8080/counter. Response for preflight has invalid HTTP status code 401

有人知道哪里出了问题吗?

最佳答案

问题与服务器端未启用的 CORS 有关。

您的服务必须使用如下 header 回答 OPTIONS 请求:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: [the same ACCESS-CONTROL-REQUEST-HEADERS from request]

这是一个很好的文档:http://www.html5rocks.com/en/tutorials/cors/#toc-adding-cors-support-to-the-server

也看看这个:Chrome v37/38 CORS failing (again) with 401 for OPTIONS pre-flight requests

对于 angularjs 1.x 中的基本身份验证,您可以尝试:

service.SetCredentials = function (username, password) {
    var authdata = Base64.encode(username + ':' + password);
    $http.defaults.headers.common = {"Access-Control-Request-Headers": "accept, origin, authorization"}; //you probably don't need this line.  This lets me connect to my server on a different domain
    $http.defaults.headers.common['Authorization'] = 'Basic ' + authdata; // jshint ignore:line

        };

对于 Angularjs 2.x 版本,请查看:

Angular2 - set headers for every request

我发现扩展 BaseRequestOptions 非常有趣:

class MyRequestOptions extends BaseRequestOptions {
  constructor () {
    super();
    this.headers.append('Authorization', 'Basic ' + authdata);
  }
} 

希望对你有帮助

关于angularjs - Angular 2 http header 似乎生成或发送不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36559274/

相关文章:

javascript - 如何在不刷新angularjs应用程序页面的情况下刷新 View

json - curl 到 libcurl http put json 格式的请求

ios - Tableview header 标签在中心对齐

jquery - ng-repeat 排序在 jQuery 中抛出异常

javascript - 如何在 ng-repeat 中传递动态变量

javascript - 如何以编程方式触发 Angular 处理程序?

json - Github API 创建提交

http - IIS和HTTP流水线,并行处理请求

c# HttpWebResponse Header 编码

html - WordPress - 将按钮添加到标题区域