我正在使用Ionic 2(2.0.0-beta.10)开展一个项目。我尝试通过请求传递授权令牌。但是没有发送标头。我试图传递的其他标头也没有被发送。
let url = 'http://www.example.com/savedata';
let data = JSON.stringify({ email: 'test@test.com', password: '123456' });
let headers = new Headers();
headers.append('Content-Type', 'application/json');
headers.append('Authorization', 'Bearer ' + "tokenContent");
let options = new RequestOptions({ headers: headers });
this.http.post(url, data, options).map(res => res.json()).subscribe(data => {
console.log("it worked");
}, error => {
console.log("Oooops!");
});
我的REST API使用以下标头接收此请求:
Host: www.example.com
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://evil.com/
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Access-Control-Request-Headers: authorization, content-type
Accept: */*
Referer: http://localhost:8100/?restart=794567
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
数据(正文)是正确的,只有我无法解决的标题问题。 任何帮助都将非常感激。
答案 0 :(得分:1)
这个问题在这里有答案: https://stackoverflow.com/a/45286959/4119650
Headers.append()
不会更新对象,它会返回其副本。通过实例化Headers对象,然后调用headers.append()
,不会使用该append
的结果。
相反,您可能需要执行以下操作:
headers: Headers = new Headers().append('Content-Type', 'application/json').append('Authorization', 'Bearer ' + "tokenContent");
Headers
无论如何都已被弃用,应将其替换为HttpHeaders
和HttpClient
。
https://angular.io/api/common/http/HttpHeaders
https://angular.io/guide/http
答案 1 :(得分:0)
尝试使用HttpClient。这是最简单和最新的一种。
constructor(private http: HttpClient) {}
...
...
postData() {
const httpHeaders = new HttpHeaders({
'Content-Type' : 'application/json',
'Cache-Control': 'no-cache',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers': 'Origin, Accept, Access-Control-Allow-Origin, Content-Type, Authorization, X-Requested-With'
});
let url = 'http://www.example.com/savedata';
let data = JSON.stringify({ email: 'test@test.com', password: '123456' });
this.http.post(url, data, { headers: httpHeaders, observe: 'response'}).subscribe(data => {
console.log("it worked");
}, error => {
console.log("Oooops!");
}); // Here you don't need to use map().
}
答案 2 :(得分:-1)
如果您正在调用与您的Angular 2 / Ionic应用程序(示例中为evil.com)位于不同域的REST API(示例中为example.com),则需要配置REST API服务器以返回这个标题:
Access-Control-Allow-Origin: http://evil.com
这将允许浏览器从evil.com主机向其余的api服务器发送异步HTTP请求。
通过在其余的api服务器上启用CORS来完成,您可以阅读更多内容。
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
支持跨源请求的后端的几个库:
https://github.com/expressjs/cors - NodeJS / Express
https://pypi.python.org/pypi/Flask-Cors/ - Flask的Python cors库
并且几乎所有其他后端框架的列表都在继续。
答案 3 :(得分:-1)
将JSON字符串化,这在任何时候都无法正常工作。 首先,您需要将JSON数据转换为StringQuery,以便服务器正确理解并快速了解。
public StringQuery(jsonString) {
return Object.keys(jsonString).map(function (key) {
return encodeURIComponent(key) + '=' + encodeURIComponent(jsonString[key]);
}).join('&');
}
然后你制作你的帖子功能或方法
public post(){
let url = 'http://www.example.com/savedata';
let data = this.StringQuery({ email: 'test@test.com', password: '123456' })
let headers = new Headers();
headers.append('Content-Type', 'application/x-www-form-urlencoded');
headers.append('Authorization', 'Bearer ' + "tokenContent");
let options = new RequestOptions({ headers: headers });
this.http.post(url, data, options).map(res => res.json()).subscribe(data => {
console.log("it worked");
}, error => {
console.log("Oooops!");
});
}
我也使用此代码并在请求后获得成功。
答案 4 :(得分:-1)
对于发送和接收,您可能使用的是一台服务器,例如:Nginx 在为后端启用站点的配置文件中,您必须添加访问控制允许来源:*或http://localhost ,这可能会有所帮助。