Tôi đã viết một API REST trên khung express cho node.js hoạt động cho các yêu cầu từ bảng điều khiển js trong Chrome và thanh URL, v.v. Tôi hiện đang cố gắng làm cho nó hoạt động với các yêu cầu từ một ứng dụng khác, trên một ứng dụng khác miền (CORS).
Yêu cầu đầu tiên, được tạo tự động bởi giao diện người dùng javascript, là / api / search? Uri =, và có vẻ như không thành công với yêu cầu OPTIONS "preflight".
Trong ứng dụng express của tôi, tôi đang thêm các tiêu đề CORS, sử dụng:
var allowCrossDomain = function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
// intercept OPTIONS method
if ('OPTIONS' == req.method) {
res.send(200);
}
else {
next();
}
};
và:
app.configure(function () {
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(allowCrossDomain);
app.use(express.static(path.join(application_root, "public")));
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});
Từ bảng điều khiển Chrome, tôi nhận được các tiêu đề sau:
URL yêu cầu: http: //furious-night-5419.herokuapp.com/api/search? Uri = http% 3A% 2F% 2Flocalhost% 3A5000% 2Fcollections% 2F1% 2Fdocuments% 2F1
Phương thức yêu cầu: OPTIONS
Mã trạng thái: 200 OK
Yêu cầu tiêu đề
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Access-Control-Request-Headers:origin, x-annotator-auth-token, accept
Access-Control-Request-Method:GET
Connection:keep-alive
Host:furious-night-5419.herokuapp.com
Origin:http://localhost:5000
Referer:http://localhost:5000/collections/1/documents/1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5
Tham số chuỗi truy vấn
uri:http://localhost:5000/collections/1/documents/1
Tiêu đề phản hồi
Allow:GET
Connection:keep-alive
Content-Length:3
Content-Type:text/html; charset=utf-8
X-Powered-By:Express
Điều này trông giống như thiếu tiêu đề thích hợp được gửi bởi ứng dụng API?
Cảm ơn.
PATCH
nếu bạn sẽ sử dụng nó thay vì PUT
phải cập nhật một nguồn tài nguyên
OPTIONS
phương thức. Ai đó có thể vui lòng giúp tôi hiểu tại sao không xử lý chỉ làPOST
phương pháp thay vì xử lý cả haiPOST
vàOPTIONS
phương pháp?