2012-06-27 47 views
14

Tôi có câu hỏi về hậu cần: Tôi đang cố gắng tìm ra cách tốt nhất để quản lý các API không đồng bộ hóa với ứng dụng. Cách tốt nhất để giải thích nó là bằng ví dụ:Cách tốt nhất để quản lý cập nhật trên ứng dụng khách/máy khách iOS

Giả sử phiên bản MyApp 1.0 đăng lên API "submit_feedbacK" yêu cầu first_name, last_name và email.

Sau đó tôi gửi MyApp phiên bản 2.0 lên App Store. Phiên bản đó được thiết kế để đăng first_name, last_name, giới tính và email tới API. Tất cả các trường này là các trường bắt buộc trên API.

Vấn đề tôi có: - Nếu tôi cập nhật API trước khi ứng dụng mới hoạt động, nó sẽ phá vỡ phiên bản 1.0 - Nếu tôi đợi cho đến khi Phiên bản 2.0 hoạt động và làm tê liệt từ xa 1.0, tôi phải ghi thời gian chính xác.

Tôi sẽ đoán rằng 'câu trả lời đúng' là duy trì hai API khác nhau. Nhưng nếu cả hai API đăng lên cùng một cơ sở dữ liệu trực tiếp, điều đó làm cho mọi thứ trở nên hơi khó xử.

Có ai có đề xuất về cách tạo mô hình này không?

+2

Tôi tin rằng ý tưởng chung là thử và thiết kế cấu trúc API và cơ sở dữ liệu nó sẽ không cần thay đổi đột ngột trong một thời gian để giảm thiểu tổng số lúng túng của mạng. Nếu giá trị của 'giới tính' không hoàn toàn cần thiết trong suốt thời gian tồn tại của 1.0, bạn có thể thực hiện mà không cần người dùng chưa cập nhật và gửi nó trong quá trình chuyển đổi phiên bản. – millimoose

+0

Điều đó đúng - trường mới cũng có thể mặc định là "nam" nếu giá trị không được cung cấp vì ứng dụng cũ sẽ không cung cấp. Tôi nghĩ rằng tôi quan tâm nhiều hơn đến những thay đổi phức tạp, như thể một khái niệm cần được tiếp cận lại. Nhưng như bạn đã nói, nếu những thay đổi lớn được lưu giữ hiếm, phần còn lại có thể được giải quyết thông qua các thông báo thời gian. Tôi cũng chỉ nhớ rằng có thể chọn thời điểm một ứng dụng hoạt động, vì vậy sẽ giúp kiểm soát cập nhật. Dù sao, cảm ơn thông tin phản hồi! – Anthony

Trả lời

7

Câu hỏi này có thể chia sẻ một số khía cạnh với iOS consuming API design.

Câu trả lời đúng là chắc chắn cung cấp hai API (ít nhất là trong một khoảng thời gian ngắn trong khi người dùng điều chỉnh). Bạn không phải duy trì hai phiên bản cùng một lúc, như khi một phiên bản mới hơn được phát hành, bạn có thể duy trì phiên bản đó và chỉ cần cung cấp phiên bản cũ cho người dùng cũ. Những thay đổi thực sự duy nhất bạn có thể phải thực hiện cho nó là những thứ như bản vá bảo mật hoặc các vấn đề chính. Những thay đổi lớn (như bạn quyết định tái cơ cấu toàn bộ cơ sở dữ liệu) có thể dẫn đến phiên bản cũ không hoạt động nữa, tuy nhiên cập nhật lên phiên bản API mới hơn nên được thiết kế để cho phép các phiên bản trước vẫn hoạt động.

Câu hỏi khác tôi đã liên kết với bạn để đưa ra câu trả lời về cách bạn có thể có phiên bản ứng dụng khác nhau truy cập phiên bản API chính xác.

Một lưu ý khác là bạn có thể dễ dàng hơn (tùy thuộc vào khung bạn đang sử dụng) để thiết kế API của bạn làm công cụ hoặc ứng dụng con và chỉ gắn kết chúng ở các điểm kết thúc khác nhau. Tôi biết rằng điều này có thể dễ dàng thực hiện được trong Rails bằng cách sử dụng Engines và trong Node with Express sử dụng app.use() với các ứng dụng con.

+0

Bạn có biết một cách để làm điều này trong codeigniter? Tôi đã nghĩ đến việc có mỗi phiên bản api mở rộng phiên bản cũ và chỉ sửa đổi những gì cần thiết. –

+0

Không, tôi không. Tôi đã không sử dụng CodeIgniter, tuy nhiên google có thể là bạn của bạn về điều này. –

0

Tôi sẽ sử dụng điểm cuối webservice/http cho giao tiếp với ứng dụng của bạn. Nếu bạn muốn duy trì cùng một URL trong tất cả các phiên bản của ứng dụng, sau đó bao gồm một số phiên bản trong tất cả các yêu cầu/bài đăng lên máy chủ để nó biết cách xử lý chúng. Điều này cũng sẽ làm cho việc phát triển và thử nghiệm dễ dàng hơn khi các phiên bản mới có thể thử nghiệm với api mới trên máy chủ.

Vì vậy, trên bất kỳ chức năng nào bạn có thể gọi trong máy chủ web/máy chủ, hãy thêm một biến duy nhất có số phiên bản. một BYTE nên là đủ như tôi nghĩ rằng bạn có thể bắt đầu lại và "giết hỗ trợ cho v1.0" một khi bạn nhấn 256 phiên bản của cùng một chức năng (nếu bao giờ).

Khi máy chủ nhận được yêu cầu/bài đăng có dữ liệu, bạn chỉ có thể mã một cấu trúc chuyển/trường hợp đơn giản trong API máy chủ để hỗ trợ hoạt động cho cả hai phiên bản.

Nếu chúng tương tự, nhưng ví dụ: hoán đổi các parametres hoặc một cái gì đó, bạn có thể xử lý tất cả các serverside và BAL/DAL (cấu trúc n-tier) có thể được duy trì trên phần máy chủ của giải pháp.

Btw.câu trả lời của tôi không chỉ dành cho iOS hoặc smartdevices, mà còn là một phương pháp tiếp cận khách hàng/máy chủ cho một thiết lập sản xuất "làm việc trong tiến trình" nơi mọi thứ phải trực tuyến, trong khi vẫn đang được phát triển và bảo trì.

Hy vọng nó có ý nghĩa, nếu không, hãy bình luận về nó và tôi sẽ cố gắng giải thích thêm.

0

chỉ là FYI, tôi sử dụng CodeIgniter. Tôi đang sử dụng Trình điều khiển REST được cung cấp tại https://github.com/philsturgeon/codeigniter-restserver. Tôi tối hậu đã kết thúc giải quyết trên có điểm kết thúc khác nhau cho mỗi phiên bản. Về cơ bản tôi muốn kiểm tra một kho lưu trữ mới cho mỗi bản phát hành và đặt nó vào một thư mục duy nhất. (ví dụ: http://www.mysite.com/1.0/api/method, http://www.mysite.com/1.1/api/method, v.v.) Cố gắng duy trì nhiều phiên bản của một API dưới một mã cơ sở chỉ nghe có vẻ quá đáng sợ. Ít nhất khi tôi phát hành một phiên bản, tôi sẽ biết nó bị khóa trong đá và tôi không phải lo lắng về việc phá vỡ nó. (Lưu ý: Tôi phải sử dụng một tinh chỉnh .htaccess đặc biệt để có được nhiều phiên bản CodeIgniter chạy từ cùng một miền. Tôi có thể chia sẻ nó nếu bạn thích)

+0

Bạn đang nói rằng khi bạn phát hành một phiên bản (ví dụ, 2.0), bạn có hiệu quả chia 2.0 của bạn thành một repo mới cho 2.1? Cách tiếp cận này dường như cho kết quả cuối cùng tương tự như các ứng dụng phụ/động cơ –

+0

Chính xác. Tôi nghĩ về việc cố gắng giữ nó như một codebase lớn, nhưng câu hỏi tôi đặt ra là: Khi tôi có 100 phiên bản của API này (1.0.0, 1.0.1, 1.0.2, 1.1.0, v.v.), hãy làm Tôi thực sự muốn có tất cả các phiên bản trong một codebase khổng lồ? Câu trả lời đơn giản là không - đó sẽ là một cơn ác mộng. Tốt hơn là chỉ cần ngã ba mỗi API và nhét nó đi vì vậy tôi không phải lo lắng về việc làm hỏng nó. Mỗi bản phát hành ứng dụng có thể trỏ tới API cụ thể của riêng nó và không lo lắng về các phiên bản trước hoặc tương lai, trừ khi tôi cố tình vô hiệu hóa một và buộc mọi người phải di chuyển sang ứng dụng mới nhất. – Anthony

+0

Phiên bản cơ sở dữ liệu vẫn là một vấn đề, nhưng tôi thấy rằng hầu như tất cả các thay đổi DB của tôi đều thêm cột. Không có nhiều thay đổi cấu trúc của những gì tôi đã làm. Nếu đó là trường hợp, thì đã đến lúc phải xem xét việc thay đổi kiểu mô hình mới, như "user_v2" và di chuyển dữ liệu cũ sang cấu trúc mới. Anywho, đó là cách tiếp cận của tôi. – Anthony

Các vấn đề liên quan