【问题标题】:Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED无法在“XMLHttpRequest”上执行“setRequestHeader”:对象的状态必须是 OPENED
【发布时间】:2018-10-22 21:13:31
【问题描述】:

我一直在使用 RESTful API get() 开发一个 Angular 应用程序。我遇到了一些错误,例如已解决的未授权错误:401。现在我得到了这个错误,这是一种直截了当的错误。我也尝试过添加 CORS 包。

我一直在寻找徒劳的解决方案。我重新编辑了我之前的问题,但似乎没有回应。

my-httpservice.service

import { Injectable } from '@angular/core';
import 'rxjs/add/operator/map';
import { Http, Response, Headers, RequestOptions, URLSearchParams } from 
'@angular/http';


@Injectable()
export class MyHttpserviceService {

constructor(private http:Http) {}

server_grid_Get(){

var request = new XMLHttpRequest();
var user = "Root";
var pass = "root";

//Use Basic authentication

request.setRequestHeader("Authorization", "Basic " + btoa(user + ":" + pass));
request.setRequestHeader('Content-Type','application/json');
request.setRequestHeader('Access-Control-Allow-Credential','true');

 request.open("GET", "http://192.100.00.000:0000/_db/xxxxx_app/_api/document/wsdl_test/4934434",true);

  return this.http.get("http://192.100.00.000:0000/_db/xxxx_app/_api/document/wsdl_test/4934434").map(response => response.json());


 request.addEventListener('load', function(event) {
    if (request.status >= 200 && request.status < 300) {
        console.log(request.responseText);
    } else {
        console.warn(request.statusText, request.responseText);
    }
  });
  request.send();
}
}

【问题讨论】:

  • 我认为您应该在进一步挖掘之前再次阅读 angular 的 http 指南(适用于 v5 angular.io/guide/http)。如果您使用的是 Angular,则不应手动创建您的 XHR。 Angular 会为你做到这一点。在您获得正确的角度代码后,我们将能够更轻松地为您提供帮助
  • @PierreMallet haii..,我会再读一遍。但我使用了这段代码,因为我正在处理 arangoDBs api。完全错了吗?
  • 手动创建 XHR 是错误的,除非您完全确定自己在做什么并且 Angular 无法为您处理它:D

标签: angular typescript restful-authentication


【解决方案1】:

来自angular guide

你应该使用类似的东西(角度 4.3+ / 确保你使用 HttpClientModule 而不是旧的 HttpModule)

@Injectable()
export class MyHttpserviceService {      
  constructor(private http:HttpClientModule) {}
  private makeMyRequest () {
       return this.http.get("http://192.100.00.000:0000/_db/xxxx_app/_api/document/wsdl_test/4934434", {
            headers: new HttpHeaders()
                .set('Authorization', 'Basic ' + btoa(user + ':' + pass))
                .set('Content-Type','application/json')
                .set('Access-Control-Allow-Credential','true')
          });
  }
}

然后在一个组件中

<yourservice>.makeMyRequest().subscribe(data => {
     // anything you want
});

【讨论】:

  • 这完美..!!非常感谢你拯救了我的一天!
【解决方案2】:

在我的情况下,我的标头在 auth 标头值的末尾有一个 \n 字符,这导致了所有的混乱

【讨论】:

  • 我也遇到了同样的问题,你是怎么处理的?
  • 去掉认证头末尾的\n
  • 问题是我想传递一个私钥(其中包含许多\n)。你有什么建议吗?
  • 我在这里回答已经 3 年了 - 所以我记不清了 - 尝试只删除最后一个 \n 字符
  • 我试试,谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
相关资源
最近更新 更多