2017-04-03 58 views
0

我以終極版 - 佐賀發送POST請求下面的代碼:Fetch Post不能在REDX-SAGA中工作?

import {put, call, fork, takeEvery} from 'redux-saga/effects'; 
import fetch from 'isomorphic-fetch'; 
const url = 'xxx/api/posts'; 


function* addPost(data) { 
    try{ 
     const response = yield fetch(url, { 
      method: 'POST', 
      headers: { 
       'Accept': 'application/json, application/xml, text/plain, text/html, *.*', 
       'Content-Type': 'application/json; charset=utf-8' 
      }, 
      body: JSON.stringify(data) 
     }); 
     const id = yield response.json().id; 
     yield put({type: types.ADD_POST, payload: {id, title, content }}); 
    }catch(e) { 
     yield put({type: types.ERROR, payload: e}); 
    } 
} 

但一個Ajax與「OPTION」方法派,有什麼錯我的代碼?爲什麼它不起作用?

回答

2

您要發送請求的服務器必須配置爲發送Access-Control-Allow-Headers響應標頭,其值包含Content-Type

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests解釋這裏發生了什麼。您的請求觸發您的瀏覽器發送CORS「預檢」。

瀏覽器在這種情況下執行預檢的具體原因是該請求包含Content-Type: application/json請求標頭。所述CORS協議要求,如果跨來源請求包括與比application/x-www-form-urlencoded其他的值的Content-Type請求頭, multipart/form-datatext/plain,瀏覽器發送一個OPTIONS請求,然後檢查該響應,看是否響應包括Access-Control-Allow-Headers響應頭,其值包含Content-Type

如果瀏覽器發現響應包含一個包含該值的響應頭,那麼瀏覽器將繼續發送您試圖使用您的代碼發出的實際的POST請求。但是,如果瀏覽器發現響應不包含該標題,或者標題不包含Content-Type,則瀏覽器將在此處停止並且不會發送POST