2011-05-23 55 views
5

Tôi đang cố triển khai ứng dụng để sử dụng dịch vụ web RESTful. Tôi đã nghiên cứu một vài ví dụ khác nhau và đã mã hóa một ứng dụng hoạt động tốt để thành công kéo từ dịch vụ REST. Nhưng bây giờ tôi cần một số hướng. Dưới đây là một số nền cơ bản (rất đơn giản) ...Android và dịch vụ RESTful

  • Giả sử dịch vụ REST cơ bản có phương thức "GetReferrers" và "AddReferrer".
  • Từ số Activity, tôi gọi số managedQuery để lấy lại Cursor từ ContentProvider cho số ListView của mình.
  • ContentProvider trả về mọi dữ liệu cục bộ và gọi async "GetReferrers" không đồng bộ để nhận danh sách liên kết giới thiệu máy chủ mới nhất.
  • Tôi có một tùy chỉnh ResponseHandler để phân tích cú pháp JSON và chèn nó vào ContentProvider.
  • Hiện tại, tôi đang xóa tất cả các bản ghi trong số ContentProvider địa phương sau khi thành công "nhận" từ máy chủ, sau đó chèn danh sách mới/cập nhật vào cơ sở dữ liệu.

Hai câu hỏi tôi đã là ...

  1. Khi tôi làm một GET mới, nó sẽ là thực tế phổ biến để xóa tất cả các hồ sơ hiện có ở địa phương ContentProvider và chèn danh sách mới? Hay nó sẽ tốt hơn (mặc dù tốn nhiều thời gian hơn) để kiểm tra các bản ghi mới/thay đổi/xóa để chỉ thêm/thay đổi/xóa, tương ứng?

  2. Tôi thực sự không biết phải bắt đầu từ đâu để thực hiện "thêm" từ ứng dụng khách để sử dụng phương thức REST "AddReferrer". Tôi biết cách thêm mục mới cục bộ vào ContentProvider bằng cách sử dụng ContentValues với getContentResolver().insert(). Nhưng, tôi sẽ đặt mã để đẩy nó lên máy chủ ở đâu? Hoặc nó sẽ là thực hành phổ biến hơn để bỏ qua việc thêm vào địa phương ContentProvider, đẩy nó lên máy chủ, sau đó để cho GET kéo nó trở lại địa phương ContentProvider?

Hy vọng rằng tất cả đều có ý nghĩa. Tôi đánh giá cao bất kỳ hướng nào bạn có thể cung cấp. Nếu ai biết về một ví dụ hai chiều tốt như thế này, hãy chia sẻ. Tất cả các ví dụ về các hoạt động của máy khách REST mà tôi đã tìm thấy cho đến nay chỉ làm "được" từ máy chủ và không đẩy lùi.

+0

cho # 2, trước tiên tôi sẽ đẩy dữ liệu vào dịch vụ REST và sau khi trả lời thành công, hãy chèn cục bộ. – binnyb

+0

Tôi nghĩ rằng đây là những gì tôi đang hướng tới # 2. – robertmiles3

+0

@ robertmiles3 Tôi hy vọng bạn đã thành công trong việc này. Có lẽ bạn có thể giúp tôi với [thiết lập tương tự] này (http://stackoverflow.com/questions/11906172/synchronize-android-client-and-rest-server). – JJD

Trả lời

2
  1. Khi tôi đã phải làm một cái gì đó như thế này khi tôi có thể thực hiện một phương pháp REST của như getReferrersSince(timestamp), mà đã cho tôi chỉ thay đổi kể từ khi đồng bộ hóa cuối cùng của tôi. Nhưng nếu dịch vụ không thuộc quyền kiểm soát của bạn, tôi cũng sẽ đề xuất tùy chọn đầu tiên. Kiểm tra mọi mục nhập cho các thay đổi có thể mất miễn là xóa và chèn lại tất cả, nhưng có nhiều khả năng là không nhất quán.
    btw: Daniele Teti đúng. Vì vậy, nó thực sự là một cái gì đó giống như
    GET http://.../referrers?since=[timestamp]

  2. Chỉ cần đảm bảo: Bạn đã xem Virgil Dobjanschi chưa? Ông đề nghị chèn các mục cục bộ trước và đánh dấu chúng là "đang chờ xử lý" trong cột cơ sở dữ liệu bổ sung (ví dụ: SYNC_STATUS). Sau đó, có một dịch vụ tải lên tất cả các mục đang chờ xử lý qua REST ở chế độ nền và đánh dấu chúng là "đã đồng bộ hóa".

+0

Tôi không chắc chắn tôi có thể đi với phương pháp của Virgil. Nếu tôi chèn một "liên kết giới thiệu" mới và nó chưa được đồng bộ hóa, thì tôi cố gắng sử dụng liên kết giới thiệu đó bằng một phương thức đăng bài khác sẽ không thành công. Người giới thiệu sẽ phải được đẩy lên thành công trước khi tôi có thể sử dụng nó ở nơi khác. – robertmiles3

+0

Đúng. Bạn sẽ phải cẩn thận trong thứ tự bạn đồng bộ hóa. Nhưng bạn đã có thể giới thiệu đến mục cục bộ. Bằng cách đó, bạn không phải đợi máy chủ trả lời người dùng, điều này sẽ không đáp ứng được. Nhưng tôi thừa nhận rằng đây không phải là tầm thường và bạn nên suy nghĩ kỹ hơn về nó;) – jederik

0

Đây chỉ là ý kiến ​​của tôi, nhưng đối với câu hỏi số 1, tôi khuyên bạn chỉ nên xóa các bản ghi hiện tại trong DB và sau đó chèn lại chúng khi có cuộc gọi web thành công. Với đề xuất sau, bạn sẽ phải tạo một hàm để lặp qua tất cả các giá trị hiện tại trong DB, xem chúng có khớp với bộ sưu tập mới không (tôi giả sử bạn có một số khóa chính để tạo kết nối) và sau đó cập nhật/remove/thêm các giá trị cho DB của bạn mà có thể có nhiều cuộc gọi đến DB của bạn trừ khi bạn tạo một số câu lệnh update chung nơi bạn xây dựng mệnh đề 'SET/WHERE' động như một chuỗi và sau đó chạy truy vấn một lần. Dù bằng cách nào, từ quan điểm hiệu quả, chỉ chạy một truy vấn xóa và chèn so với một hàm kết hợp phức tạp cộng với nhiều truy vấn cập nhật/thêm/xóa có vẻ là cách tốt nhất để đi, một lần nữa theo ý kiến ​​của tôi.

Đối với câu hỏi # 2, bạn phải xây dựng XML trong mã của bạn và sau đó gửi nó như thế này ví dụ:

Android Post Example

Another Example

Hoặc, bạn chỉ có thể vượt qua giá trị của bạn thông qua Chuỗi URL và sau đó cho phép máy chủ trích xuất các giá trị đó.

Ví dụ:

http://www.example.com/MyWebService.asmx/AddReferrer?variable1=foo&variable2=bar&variable1=foo2&variable2=bar2

Trong ví dụ mà tôi giả sử server là một máy chủ .net. Trong .net tôi về cơ bản có thể tạo ra một mảng của tất cả các giá trị cho variable1 và sau đó lặp qua chúng và thêm chúng phía máy chủ để một DB ví dụ.

[WebMethod] 
public string AddReferrer(string[] variable1, string[] variable2) 
{ 

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn. Tôi nghĩ chúng tôi đồng ý trên # 1. Nó nhanh hơn và dễ dàng hơn nhiều để chỉ thanh lọc các bản ghi hiện có và chèn lại. Đối với # 2, API REST tôi đang nói với yêu cầu một đối tượng JSON trong yêu cầu. Đó là không có vấn đề, chỉ là một FYI rằng nó không phải NET. Càng nghĩ về điều đó, tôi càng tự hỏi liệu mình có nên thực hiện một cuộc gọi không đồng bộ với bài REST, sau đó làm cho ContentProvider refresh lại "get" để kéo xuống bản ghi mới để bộ nhớ cục bộ được cập nhật. Tôi cũng cởi mở với bất kỳ suy nghĩ nào nữa. – robertmiles3

+0

Có cách nào để sửa đổi 'AddRefferer' để trả về một phản hồi tương tự như' GetRefferer'? Hoặc, các phương thức web này có phải là dịch vụ web của bên thứ ba mà bạn không thể sửa đổi không? ..vì nếu bạn có thể nhận được 'AddReferrer' để gửi trả lời giống hệt phương thức" get ", nó sẽ loại bỏ nhu cầu có hai cuộc gọi web không đồng bộ, trên thiết bị di động sẽ thích hợp hơn vì bạn có nhiều người dùng có thể có kết nối mạng kém. – AngeloS

+0

Ngoài ra, đây là liên kết để đăng json: [android post json] (http://localtone.blogspot.com/2009/07/post-json-using-android-and-httpclient.html) – AngeloS

-1

Trong tên phương thức, bạn không nên có động từ. Trong một hệ thống RESTful, "hành động" là ngầm định với động từ yêu cầu http. AddReferrer nên được gọi là "liên kết giới thiệu" và nên được gọi bằng phương pháp http PUT. Kiểm tra bài viết sau http://www.infoq.com/articles/rest-introduction

+0

Đồng ý, và chúng không có động từ trong phương pháp của chúng. Tên phương pháp trên không phải là tên thật và hoàn toàn là giải thích về những gì tôi theo sau. Bạn đã bỏ lỡ điểm hoàn toàn. – robertmiles3

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