Angular學習:http請求失敗的問題
阿新 • • 發佈:2019-02-17
1 問題
在學習angular時,以下程式碼的http的post請求一直失敗。
import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import { Subject } from 'rxjs/Subject'; import 'rxjs/Rx'; import { Http, Headers, Request, Response, RequestOptions, RequestMethod } from '@angular/http'; import { RequestArgs } from '@angular/http/src/interfaces'; import { UserModel } from '../user-model'; @Injectable() export class UserLoginService { public subject: Subject<UserModel> = new Subject<UserModel>(); public userLoginURL = "http://localhost:8899/login"; constructor(public http:Http) { console.log("Angular2---------UserLoginService.constructor"); } public get currentUser():Observable<UserModel>{ return this.subject.asObservable(); } public login(user: UserModel){ console.log("Angular2---------UserLoginService.login"); let body = JSON.stringify(user); let headers = new Headers(); headers.append("Content-Type", "application/json;charset=UTF-8"); return this.http.post("http://localhost:8899/login", body, {headers: headers}) .map((response: Response)=>{ console.log("Angular2---------UserLoginService.login Response : " + JSON.stringify(response.json())); let data = response.headers; return data; }) .subscribe( data => { console.log("Angular2---------UserLoginService.login subscribe data : " + JSON.stringify(data.toJSON())); }, error => { console.log("Angular2---------UserLoginService.login err"); console.error(error); } ); } }
由於第一次學習web開發,一直糾結於
為什麼程式碼中的POST方法變為OPTIONS方法?
直到打開了firefox的除錯工具的[安全]log輸出,發現上述出錯log之下有以下log。
已攔截跨源請求:同源策略禁止讀取位於 http://localhost:8899/login 的遠端資源。(原因:CORS 頭缺少 'Access-Control-Allow-Origin')。
2 原因
所以在每次http請求之前,都會向伺服器[http://localhost:8899]發1次OPTIONS請求,確認伺服器是否容許跨源請求。
而伺服器沒有做跨源CORS設定,所以每次OPTIONS請求都會出錯。