2012-07-30 24 views
3

我用express.js我的服務器,這個標題:CORS與Express.js和jQuery.ajax

x-powered-by: Express 
connection: keep-alive 
content-length: 2 
content-type: application/json; charset=utf-8 
access-control-allow-methods: GET,PUT,POST,DELETE 
access-control-allow-origin: * 
access-control-allow-headers: x-requested-with 

我打電話res.header允許CORS:

res.header("Access-Control-Allow-Origin:", "*"); 
res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE"); 
res.header("Access-Control-Allow-Headers", "x-requested-with"); 

你可以測試這裏:http://my-api.rs.af.cm/api/products

對於我的前端,我用jsbin和我打電話給我的服務器$.ajaxhttp://jsbin.com/apizez/37/edit

結果在這裏:http://jsbin.com/apizez/37

你可以看一下JS的控制檯,你會看到這樣的錯誤:

XMLHttpRequest cannot load http://my-api.rs.af.cm/api/products. Origin http://jsbin.com is not allowed by Access-Control-Allow-Origin. 

我讀了CORS所有其他的答案,我不希望使用easyXDM。

+0

是所有路過這些頭回的請求?您是否支持預檢選項請求? – 2012-07-31 01:07:26

+1

剛看,是的,Chrome正在做一個預檢OPTIONS請求,它沒有得到任何CORS頭文件。修復你會有這個舔。 – 2012-07-31 01:09:27

+0

請參閱https://developer.mozilla.org/En/HTTP_access_control#Preflighted_requests – 2012-07-31 01:11:29

回答

3

感謝Ryan Olds幫助我理解CORS請求如何工作。

這裏正確的標題:

res.header('Access-Control-Allow-Origin', req.headers.origin || "*"); 
res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS'); 
res.header('Access-Control-Allow-Headers', 'content-Type,x-requested-with'); 

我所有的請求必須在他們的響應頭。

我使用$.getJSON GET請求與jQuery,否則它不起作用。

您可以在這裏看到的例子: http://jsbin.com/uwevuc/2/edit

http://jsbin.com/uwevuc/2

+0

請注意,在大多數情況下'*'不起作用(有關詳細信息,請在規範中檢查簡單與預檢請求),則需要在允許源標頭中明確提及您的域。另外,不需要允許OPTIONS或標準頭文件(如content-type或origin),默認情況下它們是允許的。 – Tgr 2012-07-31 09:40:42

+0

我編輯我的帖子以添加原始請求明確性,謝謝。對於頭文件,我需要指定「content-type」,否則我有這個錯誤:'請求標頭字段Content-Type不被Access-Control-Allow-Headers所允許。「但事實上,我們並不需要有起源和接受。 – Atinux 2012-07-31 09:45:54

+1

正確的是,對於某些標準類型(如text/plain),內容類型只能被省略。 – Tgr 2012-07-31 10:04:09