Lỗi khi get API các tỉnh thành Việt Nam

Em có get API từ https://thongtindoanhnghiep.co/rest-api. Em dùng ajax để get API:

$.ajax({
    type: "GET",
    url: "https://thongtindoanhnghiep.co/api/city",
    dataType: "json",
    success: function (data) {
        alert(data)
    }
})

Nhưng khi check thì nó lại bị CORS:

Access to XMLHttpRequest at 'https://thongtindoanhnghiep.co/api/city' from origin 'http://localhost' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Cho em xin hỏi vấn đề này là do em get API chưa đúng, hay là do API bên kia chưa allow vậy a

1 Like

CORS là gì?

5 Likes

Có 3 cách giải quyểt:

  • Cách 1 là dùng một số dịch vụ để bypass CORS, nổi tiếng nhất là CORS Anywhere, cách này có ưu điểm là siêu đơn giản, cứ việc bỏ url vào như thế này: https://cors-anywhere.herokuapp.com/url-của-bạn, ví dụ: https://cors-anywhere.herokuapp.com/https://daynhauhoc.com. Tuy nhiên cách này lại có nhược điểm là sẽ bị giới hạn lượng request được gửi trong 1 tiếng, sẽ có một vài trang không vào được và phải có một trong 2 header trong request là origin, x-requested-with nếu không sẽ bị lỗi “Missing required request header. Must specify one of: origin,x-requested-with” :sweat_smile:.

  • Cách 2 là dùng jsonp.

Cứ hiểu là cái này sẽ giúp cho em có thể get dữ liệu xuyên website(không tính ảnh, video, script, iframe,…) mà không bị dính CORS. Nhưng cách này có nhược điểm là bên mà em get dữ liệu phải hỗ trợ JSONP, thế thôi :sweat_smile:.

  • Cách 3 là tạo ra server trung gian, ở đây chính là server của website của em :smiley:. Cách này là cách dài dòng nhất, tất nhiên là cũng chẳng phức tạp lắm. Ở bên phía server sẽ get dữ liệu từ trang kia rồi trả về cho client. Cách này có ưu điểm lớn, đủ để anh xem là cách tốt nhất là việc em chẳng phụ thuộc vào bên nào cả. Tự mình code server, vừa mở mang kiến thức, lại vừa ổn định. Chuyện gì sẽ xảy ra nếu CORS Anywhere không GET được dữ liệu hay em GET quá nhiều, bên website kia không hỗ trợ JSONP hay hiện tại có nhưng sau này thì sao? Cách này hơi dòng nhưng không khó, à nói là dài dòng thôi chứ khi code còn chưa đến 100 dòng :rofl: . Anh chưa lập trình PHP bao giờ nhưng có lập trình Nodejs, bên ấy có 2 thư viện nổi tiếng về HTTP Request là request(đã tạm ngừng phát triển) và Axios :smiley:.
7 Likes

hay quá ạ! Mình cảm ơn !

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