2016-06-14 51 views
2

我在發佈請求中設置應用程序/ json標頭的內容類型時遇到問題。在Angular2 HTTP POST中設置JSON請求標頭

saveUpdates(alltabs: AllTabs): Observable<Response> { 
      let api = this.host + this.routes.save; 
      let headers = new Headers(); 
      headers.append('Content-Type', 'application/json'); 

      return this._http.post(api, JSON.stringify(alltabs), { headers: headers }) 
      .map((response: Response) => <Response>response.json()) 
      .do(data => console.log("saveUpdates(): " + data)) 
      .catch(this.handleError); 
    } 

請求報頭:

OPTIONS /api/productsave HTTP/1.1 
Host: wbtest:92 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 
Access-Control-Request-Method: POST 
Origin: http://localhost:3000 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36 
Access-Control-Request-Headers: content-type 
Accept: */* 
Referer: http://localhost:3000/product/60000010080 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-US,en;q=0.8 

響應頭:

HTTP/1.1 405 Method Not Allowed 
Cache-Control: no-cache 
Pragma: no-cache 
Allow: POST 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Date: Tue, 14 Jun 2016 15:16:15 GMT 
Content-Length: 76 

正如你看到的,我的要求有兩個意想不到的標題添加 「訪問控制請求報頭」 和「訪問控制請求法」。這似乎表明CORS(跨源資源共享)存在問題。但是,API服務器上的web.conf文件一直在工作,並且響應標頭指出「Access-Control-Allow-Origin:*」。

任何想法可能是錯誤的?

UPDATE:

上面的代碼是正確的 - 問題是與不被配置爲處理預檢請求Sever的代碼。就我而言,.NET Web API 2應用程序未配置爲允許CORS。

回答

3

使用CORS,您有兩種請求。作爲事實上,在CORS規範區分兩種不同的使用情況:

  • 簡單的請求。這個用例適用於我們使用HTTP GET,HEAD和POST方法的情況。對於POST方法,僅支持具有以下值的內容類型:text/plain,application/x-www-form-urlencodedmultipart/form-data
  • 預照明請求。當「簡單請求」用例不適用時,首先請求(使用HTTP OPTIONS方法)檢查​​在跨域請求的上下文中可以做什麼。

看來您的服務器未配置爲支持預檢請求。 405狀態碼的原因(405方法不允許)。

請參閱本文的詳細信息:

+0

我認爲你是正確的(Chrome,但是狀態 「預檢響應無效HTTP」),但加入「<添加名稱= 「Access-Control-Allow-Methods」value =「GET,PUT,POST,DELETE,OPTIONS」/>「和」到我的web.conf仍然給出同樣的問題。 –

+0

我不知道你用於你的服務器,但通常有事情要做。例如對於Node,您需要在Express中定義一箇中間件來處理OPTIONS方法。請參閱https://www.npmjs.com/package/cors –

+0

感謝蒂埃裏。看來我們的.NET Web API 2應用程序未配置爲處理預檢請求。 –