Online API lấy danh sách tỉnh thành quận huyện Việt Nam

Cảm ơn bạn đã test. Mình vừa sửa lỗi ở depth=3.
Về các endpoint /ap/p, api/d, api/w thì ban đầu mình định không sử dụng, nhưng có lẽ người dùng sẽ dùng nó thật, sẽ bổ sung.

3 Likes

Nên có api lấy từng đơn vị lẻ, giả sử mình chỉ muốn lấy các xã (tương đương)trong 1 huyện (tương đương), chả lẽ lại phải gọi đến api depth=3 để lấy, tốn dữ liệu lắm.

2 Likes

Bạn đọc không kĩ tài liệu rồi. Trường hợp của bạn, gọi GET /api/d/{code} là ra thôi.

https://provinces.open-api.vn/api/p/1 cho Hà Nội? Lỗi 404. Đã hoạt động.

Cám ơn bạn, đã sửa. Hơi bị lúng túng với cách cấu hình của bọn Vercel.
Đây là ví dụ lấy danh sách các xã ở huyện quê mình: https://provinces.open-api.vn/api/d/754?depth=2

3 Likes

A post was split to a new topic: Hướng dẫn get danh sách tỉnh thành quận huyện Việt Nam bằng ajax

Bác cho e hỏi cái hàm function markRequireAll ở trên có chức năng gì vậy ạ,
và nếu k dùng nó thì param q ở đây giá trị là gì vậy ạ?

function markRequireAll(query) {
  const words = query.split(/\s+/)
  return words.map(w => `+${w}`).join(' ')
}

async function searchProvince(term, app) {
  if (app.selectedProvince && app.selectedProvince.name === term) {
    return
  }
  const rdata = await ky.get('/api/p/search/', {
    searchParams: { q: markRequireAll(term) }
  }).json()
  app.filteredProvinces = mask(rdata, array(Province))
}

Có cái comment ngay phía đầu hàm để giải thích mà bạn copy kiểu gì cũng phải cắt nó ra là sao nhỉ?

/*
 * The Lunr engine consider each keyword optional, but in the context of
 * this demo, we want all keywords to be present
 */
function markRequireAll(query) {
  const words = query.split(/\s+/)
  return words.map(w => `+${w}`).join(' ')
}

Nó đơn giản là thêm dấu “+” vào trước từng từ trong chuỗi thôi, “Bà Rịa” -> “+Bà +Rịa”.
q đơn giản là cụm từ bạn muốn tìm kiếm thôi.

3 Likes

dạ tại e đang k biết bên anh dùng thư viện gì để nối các params thành url, với cả cũng k rõ thuật toán tìm kiếm bên anh, nên mới k rõ nó tại sao phải thêm dấu + vào trc từng từ ạ

Đâu có cần nối gì đâu? Tự thư viện HTTP client lo chuyện đó. Còn mình dùng thư viện nào để request HTTP thì nó nằm sát bên dòng code bạn đang đọc.

  const rdata = await ky.get('/api/d/search/', {
    searchParams: { q: markRequireAll(term), p: provinceCode }
  }).json()

Bạn đang đọc tới chỗ “q: markRequireAll(term)” thì liếc ngay lên dòng phía trên là thấy tên thư viện đang dùng rồi: “ky.get()

Comment nói mục đích của việc thêm dấu “+” rồi:

The Lunr engine consider each keyword optional, but in the context of this demo, we want all keywords to be present.

Biến từ “optional” thành “required” thôi.

3 Likes

mình muốn lấy tới thôn xóm thì sao ad?

Dữ liệu đó không có, nếu có thì đã viết vào tài liệu, chứ mắc gì hướng dẫn lấy đến 3 cấp rồi tự dưng lại bỏ thôn xóm ra?

2 Likes

Cho mình hỏi ở đây có ai dùng Vue JS call api bằng axios mà bị lỗi CORS giống mình ko nhỉ

1 Like

Mình cũng bị như thế…

Mình dùng VueJS để call API mà dính lỗi CORS thì phải làm sao ạ. Mình cảm ơn!

Vụ CORS thì các bạn phải tự tìm cách theo dõi được request “preflight” mà trình duyệt gửi đi, xem nó có kết quả gì.

Bên mình thì không tái hiện được lỗi CORS này. Mình có một demo khác cho VueJS (Vue 3 + TypeScript) ở đây: https://github.com/hongquan/vn-provinces-vue-demo
Nó được triển khai trên một website riêng để kiểm chứng là không có lỗi CORS.

4 Likes

cho mình hỏi,tại sao mình search huyện Thới lai cần thơ lại ra như thế này nhỉ?

@hongquan
https://provinces.open-api.vn/api/d/search/?q=lai sẽ bị lỗi tương tự. Bất kì từ tìm kiếm nào chứa từ (word) lai sẽ bị lỗi.
Có thể còn nhiều từ khác có lỗi này. Liệu nó có trùng với từ khóa (keyword) nào của framework này không?

2 Likes

Cám ơn @kanekirito@SITUVN.gcd đã “chụp” được lỗi. Lỗi này do một thư viện search engine bên dưới trả về kết quả không như mong đợi nên rơi vào nhánh điều kiện chưa được xử lý, gây crash. Mình mới sửa.

4 Likes

tiện cho em hỏi có api nào hiện danh sách tôn giáo, dân tộc public không ạ

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