1. 程式人生 > >Angular學習:http請求失敗的問題

Angular學習:http請求失敗的問題

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請求都會出錯。

3 解決問題