No 'Access-Control-Allow-Origin' header is present on the requested resource

Mấy anh cho em hỏi chút ạ.
Em viết đoạn JS Ajax như dưới đây để get data từ link này http://api.2dev4u.com/json/posts nhưng gặp lỗi này

 XMLHttpRequest cannot load http://api.2dev4u.com/json/posts. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://dev.2dev4u.com' is therefore not allowed access.

có cao nhân nào giúp đỡ em hướng giải quyết được không ạ. Cái này là do server hay sao ạ?

$(document).ready(function() {

    var url = 'http://api.2dev4u.com/json/posts';
    var settings = {
        "async": true,
        "crossDomain": true,
        "url": url,
        "method": "GET",
        "headers": {
            "cache-control": "no-cache",
        }
    }

    $.ajax(settings).done(function(response) {
        console.log(response);
    });
});

không cross domain kiểu này qua ajax được đâu bạn nhé. Trừ khi svr họ mở cho bạn.
Bạn phải làm hành đôngj này phía svr của bạn, code 1 file nodejs/c++/php hoặc bất cứ thứ gì để lấy dữ liệu từ server họ, ajax thực hiện request đến server của bạn, domain phải giống với nhau.

2 Likes

Lỗi này là do bên đó họ không có mở ‘Access-Control-Allow-Origin’ ở trong header nên trình duyệt tự động chặn request luôn. cách giải quyết thì bạn chỉ có thể viết code bên server-side để lấy bài nha

1 Like

Dùng JSONP chắc được

1 Like

Không được đâu, response không đúng chuẩn jsonp.

Có nghĩa là khác sub domain cũng không được phải không bạn, vì cái này mình request cùng server chỉ khác sub domain thôi http://dev.2dev4u.com/demo/index.html

đúng rồi bạn, phải giống nhau.

Ngoài cách dùng 1 proxy bằng nodejs/c++/php thì còn cách nào khác không bạn nhỉ

Site đó có phải site của bạn không?
Nếu phải thì bạn bật header đó lên, còn không thì không có cách nào cả.

Site đó là của mình nhưng mình đang tim hiểu xem có cách nào khác có thể request mà không cần config header không, site của mình thì mình có thể config.
Nhưng muốn get data từ trang khác mà cũng gặp trường hợp này thì không thể config header theo ý mình được :smiley:
Cảm ơn nhưng chia sẻ của bạn :innocent:

Sure, I’m learning more about it. Thanks for your sharing.

Còn 1 vấn đề là response từ http://api.2dev4u.com/json/posts không phải là JSON. Bạn cần thêm vào header Content-Type: application/json; charset=UTF-8. Việc này nhằm tránh lỗi phân tích JSON chứ không giải quyết được vấn đề CORS.

Nếu bạn dùng PHP thì giải pháp là cURL.
Nếu vẫn dùng JavaScript thì hầu như không có cách nào, có thể lách bằng CORS proxy, nhưng những dịch vụ như thế thường không ổn định. Ví dụ:

1 Like

Cái response đó không nhất thiết là JSON đâu bạn, mình muốn get toàn bộ trang giống như lúc bạn view-source lên ấy.
Như bạn mói thì mình cũng đã dùng cURL và đã khắc phục được lỗi này

Mình dùng Simple PHP Proxy thấy khá là hay, bạn có thể tham khảo http://benalman.com/code/projects/php-simple-proxy/examples/simple/

Mình cũng đã tìm hiểu được sơ sơ rồi.
Cảm ơn bạn :innocent:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?