Cần dự án Android REST Client mẫu triển khai mẫu triển khai Virgil Dobjanschi REST


82

Tôi muốn xây dựng một REST Client trên điện thoại Android.

Máy chủ REST tiết lộ một số tài nguyên, ví dụ: (GET)

http://foo.bar/customer      List of all customer
http://foo.bar/customer/4711    The customer with id 4711
http://foo.bar/customer/vip     List of all VIP customer

http://foo.bar/company           List of all companys
http://foo.bar/company/4711     The company with the ID 4711
http://foo.bar/company/vip      List of all VIP companys

Tôi (nghĩ) Tôi biết cách nói chuyện với máy chủ REST và nhận thông tin tôi cần. Tôi sẽ triển khai một lớp REST Client với một API như thế này

public List<Customer> getCustomers();
public Customer getCustomer(final String id);
public List<Customer> getVipCustomer();

public List<Company> getCompanies();
public Customer getCompany(final String id);
public List<Customer> getVipCompanies();

Tham khảo bài thuyết trình " Phát triển ứng dụng máy khách Android REST " từ Virgil Dobjanschi, tôi biết rằng không nên xử lý yêu cầu REST trong Chuỗi hoạt động của người lao động. Thay vào đó, tôi nên sử dụng API dịch vụ .

Tôi thích ý tưởng có một ServiceHelper Singleton liên kết với một Dịch vụ (Cục bộ) nhưng tôi sợ rằng tôi không hiểu đúng khái niệm Dịch vụ.

Hiện tại, tôi không hiểu cách báo cáo kết quả cuộc gọi REST (được thực hiện không đồng bộ trong một Dịch vụ) trở lại Hoạt động của người gọi. Tôi cũng tự hỏi liệu tôi có cần MỘT Dịch vụ xử lý tất cả các yêu cầu REST (với các loại trả lại khác nhau) hay tôi cần một dịch vụ chuyên dụng cho từng yêu cầu REST.

Có lẽ tôi còn nhiều vấn đề về hiểu biết khác nên điều tốt nhất đối với tôi là một ứng dụng mẫu đáp ứng nhu cầu của tôi. Trường hợp sử dụng của tôi không có gì bất thường và tôi hy vọng có một ứng dụng ví dụ nào đó.

Bạn vui lòng cho tôi biết!

Bất kỳ đề xuất nào khác cho tôi biết hướng triển khai chính xác cũng hữu ích (Android API-Demo không phù hợp với trường hợp sử dụng của tôi).

Cảm ơn trước.

Klaus

CHỈNH SỬA : Các chủ đề tương tự được tìm thấy trên SO (sau khi đăng bài này) dẫn tôi đi theo hướng tôi cần (giảm thiểu "mẫu Dobjanschi" phức tạp):


1
Claszen, Bạn có ý kiến ​​gì về dịch vụ duy nhất cho tất cả các yêu cầu so với các dịch vụ dành riêng cho từng yêu cầu không? Nếu có bạn có thể vui lòng chia sẻ. Tình huống trong trường hợp của tôi: Tôi có nhiều yêu cầu REST [khoảng 20] được sử dụng trong ứng dụng của mình. Tôi đã xem phiên có giá trị trong Google I / O được đề cập ở trên. Câu hỏi của tôi là, cách tiếp cận nào tốt hơn. Để có một dịch vụ xử lý tất cả các yêu cầu trong một dịch vụ? hoặc để có một dịch vụ tận tâm cho từng yêu cầu? Tôi có một số yêu cầu nên được kích hoạt tuần tự và một số yêu cầu trong số chúng có thể được kích hoạt đồng thời. Bất kỳ đề xuất ?

@ user778869 Cuối cùng, tôi đã sử dụng một IntentService và ResultReceiver cho mỗi tài nguyên REST ('cấp cao nhất') (như 'công ty', 'khách hàng'). Tôi thấy đây là một loại cấu trúc 'tự nhiên' và hoạt động tốt. Nó có thể tạo ra một số trùng lặp mã nhưng ngăn chặn việc sử dụng quá nhiều cấu trúc điều khiển nếu nó được thực hiện tất cả trong một dịch vụ.
FrVaBe

Điều này có thể rất hữu ích cho những người đang học cách triển khai ứng dụng khách Android REST. Bản trình bày của Dobjanschi được chuyển thành PDF: drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/…
Kay Zed

Câu trả lời:


50

Tổng quat

Biên tập:

Bất kỳ ai quan tâm cũng cân nhắc xem RESTful android, điều này có thể cho bạn cái nhìn tốt hơn về nó.

Điều tôi học được từ kinh nghiệm khi cố gắng triển khai Mô hình Dobjanschi, đó là không phải mọi thứ đều được viết bằng đá và anh ấy chỉ cung cấp cho bạn cái nhìn tổng quan về những gì cần làm, điều này có thể thay đổi từ ứng dụng này sang ứng dụng khác nhưng công thức là:

Làm theo ý tưởng này + Thêm ứng dụng Android của riêng bạn = Chúc mừng

Mô hình trên một số ứng dụng có thể thay đổi theo yêu cầu, một số có thể không cần Tài khoản cho SyncAdapter khác có thể sử dụng C2DM, cái này mà tôi đã làm việc gần đây có thể giúp ai đó:


Tạo một ứng dụng có Account và AccountManager

Nó sẽ cho phép bạn sử dụng SyncAdapter để đồng bộ hóa dữ liệu của mình. Điều này đã được thảo luận trên Tạo SyncAdapter của riêng bạn

Tạo ContentProvider (nếu nó phù hợp với nhu cầu của bạn)

Sự trừu tượng này cho phép bạn không chỉ truy cập cơ sở dữ liệu mà còn đi tới ServiceHelper để thực hiện các cuộc gọi REST vì nó có phương pháp Ánh xạ một-một với REST Arch.

Nhà cung cấp nội dung | Phương pháp REST

truy vấn ----------------> GET

chèn ----------------> PUT

cập nhật ----------------> ĐĂNG

xóa ----------------> XÓA

ServiceHelper Layering

Anh chàng này về cơ bản sẽ bắt đầu (a) (các) dịch vụ thực thi một phương thức Http (không nhất thiết là giao thức nhưng nó là phương thức phổ biến nhất) REST với các tham số mà bạn đã truyền từ ContentProvider. Tôi đã chuyển số nguyên đối sánh được nhận từ UriMatcher trên Nhà cung cấp nội dung để tôi biết tài nguyên REST nào cần truy cập, tức là

class ServiceHelper{

    public static void execute(Context context,int match,String parameters){
//find the service resource (/path/to/remote/service with the match
//start service with parameters 
    }

}

Dịch vụ

Được thực thi (tôi sử dụng IntentService hầu hết thời gian) và nó đi đến RESTMethod với các tham số được truyền từ trình trợ giúp, nó tốt cho điều gì? Hãy nhớ rằng Dịch vụ rất tốt để chạy mọi thứ trong nền.

Đồng thời triển khai BroadCastReceiver để khi dịch vụ được hoàn thành với công việc của nó, hãy thông báo cho Hoạt động của tôi đã đăng ký Broadcast này và yêu cầu lại. Tôi tin rằng bước cuối cùng này không nằm trong Hội nghị Virgill nhưng tôi khá chắc chắn là một cách tốt để đi.

RESTMethod lớp

Lấy các tham số, tài nguyên WS ( http://myservice.com/service/path ) thêm các tham số, chuẩn bị mọi thứ, thực hiện cuộc gọi và lưu phản hồi.

Nếu cần authtoken, bạn có thể yêu cầu từ AccountManager Nếu việc gọi dịch vụ không thành công do xác thực, bạn có thể làm mất hiệu lực của authtoken và reauth để lấy mã thông báo mới.

Cuối cùng, RESTMethod cung cấp cho tôi XML hoặc JSON cho dù tôi tạo bộ xử lý dựa trên bộ so khớp và chuyển phản hồi.

Bộ xử lý

Nó có nhiệm vụ phân tích cú pháp phản hồi và chèn nó vào cục bộ.

Một ứng dụng mẫu? Tất nhiên!

Ngoài ra, nếu bạn thấy thú vị với một ứng dụng thử nghiệm mà bạn nhìn vào Eli-G , nó có thể không phải là ví dụ tốt nhất nhưng nó tuân theo cách tiếp cận Service REST, nó được xây dựng với ServiceHelper, Processor, ContentProvider, Loader và Broadcast.


Cảm ơn câu trả lời của bạn. Cuối cùng tôi đã sử dụng một IntentService và ResultReceiver cho mỗi tài nguyên REST ('cấp cao nhất') (như 'công ty', 'khách hàng'). Mô hình Dobjanschi quá nặng đối với tôi.
FrVaBe

Cũng bằng cách sử dụng IntentService và ResultReseiver, bạn có thể sử dụng kịch bản mô tả đầu tiên là mô hình Service-Driven, mặc dù anh ấy sử dụng Binder thay vì ResultReceiver để giao tiếp nhưng điều đó tốt như tôi đã nói là không được viết bằng đá !.
Necronet

Đó là một thời gian trước đây tôi đã đặt câu hỏi và tôi đã tìm thấy một giải pháp phù hợp với tôi. Tôi không có khả năng kiểm tra tất cả các tham chiếu đến các ứng dụng mẫu - nhưng vì đây là câu trả lời cập nhật nhất nên tôi sẽ chấp nhận. Tuy nhiên, tôi khuyên bạn nên kiểm tra tất cả các câu trả lời khác.
FrVaBe

Excelent sugestion, kiểm tra tất cả câu trả lời, tất cả chúng đều có rất nhiều tài nguyên và ý tưởng tốt !! như Jeremy với cuốn sách Lập trình Android Yoni với nguồn được lập lịch.
Necronet

@Necronet xin chào, bạn vừa gặp phải ứng dụng mẫu đầy hứa hẹn của bạn - tuy nhiên, tôi đang gặp khó khăn khi xây dựng nó. Bạn có phiền cho chúng tôi biết nó phải xây dựng phiên bản ActionBarSherlock nào không (có vẻ như nó không hoạt động với ABS 4.1 mới nhất)? Ngoài ra, từ bài đăng của bạn, tôi không thực sự tìm ra mẫu (A, B hoặc C) nào trong các mô hình của Dobjanschi mà bạn đang hướng tới (Tôi biết, có thể bạn đã kết thúc với một số biến thể, nhưng tôi cho rằng bạn chủ yếu tập trung vào một trong số các mẫu - Tôi cho là mẫu B?) Cảm ơn!
vaiomike

17

Lập trình Android có một chương hoàn chỉnh (13. Khám phá các nhà cung cấp nội dung) dành riêng cho 'Tùy chọn B: Sử dụng API ContentProvider' từ cuộc nói chuyện Google I / O của Virgil.

Chúng tôi không phải là những người duy nhất nhìn thấy lợi ích của phương pháp này. Tại hội nghị Google I / O vào tháng 5 năm 2010, Virgil Dobjanschi của Google đã trình bày một bài nói chuyện nêu ra ba mô hình sau để sử dụng các nhà cung cấp nội dung để tích hợp các dịch vụ web RESTful vào các ứng dụng Android ...

Trong chương này, chúng ta sẽ khám phá chi tiết mô hình thứ hai với ví dụ video Finch thứ hai của chúng tôi; chiến lược này sẽ mang lại một số lợi ích quan trọng cho các ứng dụng của bạn. Do sự sang trọng mà phương pháp này tích hợp các hoạt động mạng vào Android MVC, chúng tôi đã đặt cho nó biệt danh là “Network MVC”.

Một ấn bản trong tương lai của Lập trình Android có thể đề cập đến hai cách tiếp cận khác, cũng như ghi lại các chi tiết hơn về bản trình bày này của Google. Sau khi bạn đọc xong chương này, chúng tôi khuyên bạn nên xem bài nói chuyện của Google.

Rất khuyến khích.

Lập trình Android bởi Zigurd Mednieks, Laird Dornin, G. Blake Meike và Masumi Nakamura. Bản quyền 2011 O'Reilly Media, Inc., 978-1-449-38969-7.


11

"Phát triển ứng dụng khách Android REST" của Virgil Dobjanschi đã dẫn đến nhiều cuộc thảo luận, vì không có mã nguồn nào được trình bày trong phiên hoặc được cung cấp sau đó.

  • Triển khai tham chiếu có sẵn trong http://datadroid.foxykeep.com (phiên Google IO được đề cập trong / Presentation). Nó là một thư viện mà bạn có thể sử dụng trong ứng dụng của riêng mình.
  • Hàng đợi công việc ưu tiên của Android được lấy cảm hứng từ bài nói chuyện của Dobjanschi và có vẻ rất hứa hẹn với tôi.

Vui lòng bình luận nếu bạn biết thêm cách triển khai.


Cám ơn chia sẻ liên kết này có lẽ hữu ích (không có cơ hội để có một cái nhìn sâu hơn vào lúc này)
FrVaBe

Đó có vẻ như là một giải pháp. Cảm ơn bạn !
Vincent Cantin

7

Chúng tôi đã phát triển một thư viện giải quyết vấn đề này: RoboSpice .

Thư viện sử dụng "phương pháp tiếp cận dịch vụ" được mô tả bởi Virgil DobjanschiNeil Goodmann , nhưng chúng tôi cung cấp một giải pháp tất cả trong một hoàn chỉnh:

  • thực thi các yêu cầu mạng không đồng bộ (trong AndroidService nền) sẽ trả về POJO (ví dụ: yêu cầu REST)
  • kết quả vào bộ nhớ đệm (trong Json, hoặc Xml, hoặc tệp văn bản phẳng, hoặc tệp nhị phân)
  • thông báo cho các hoạt động của bạn (hoặc bất kỳ bối cảnh nào khác) về kết quả của yêu cầu mạng nếu chúng vẫn còn sống
  • không thông báo cho các hoạt động của bạn về kết quả nếu họ không còn sống nữa
  • thông báo các hoạt động của bạn trên Chuỗi giao diện người dùng của họ
  • sử dụng một mô hình xử lý ngoại lệ đơn giản nhưng mạnh mẽ
  • hỗ trợ nhiều ContentServices để tổng hợp các kết quả dịch vụ web khác nhau
  • hỗ trợ đa luồng thực thi yêu cầu
  • được gõ mạnh!
  • là mã nguồn mở;)
  • và đã thử nghiệm

Chúng tôi thực sự đang tìm kiếm phản hồi từ cộng đồng.


4

Trang bị thêm có thể rất hữu ích ở đây, nó xây dựng một Bộ điều hợp cho bạn từ một cấu hình rất đơn giản như:

Trang bị thêm biến API REST của bạn thành một giao diện Java.

public interface GitHubService {
  @GET("/users/{user}/repos")
  List<Repo> listRepos(@Path("user") String user);
}

Lớp RestAdapter tạo ra một triển khai của giao diện GitHubService.

RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .build();

Dịch vụ GitHubService = restAdapter.create (GitHubService.class); Mỗi cuộc gọi trên GitHubService được tạo sẽ thực hiện một yêu cầu HTTP đến máy chủ web từ xa.

List<Repo> repos = service.listRepos("octocat");

để biết thêm thông tin, hãy truy cập trang web chính thức: http://square.github.io/retrofit/

Lưu ý : bộ chuyển đổi RestAdapterbạn nhận được từ Retrofit không phải do BaseAdapterbạn tạo ra, bạn nên tạo một trình bao bọc cho nó bằng cách nào đó giống như câu hỏi này VẬY Tại sao ListView của tôi trống sau khi gọi setListAdapter bên trong ListFragment?


Bạn có thể gửi một ví dụ đầy đủ một dịch vụ gọi còn lại như api.icndb.com/jokes/random
exequielc


3

Bạn nên xem mã nguồn cho ứng dụng I / O 2010 chính thức của Google , để bắt đầu, đặc biệt là SyncService và các lớp khác nhau trong gói con io .


+1 Không hẳn là trường hợp sử dụng của tôi nhưng trong mọi trường hợp là một ví dụ ứng dụng Android tốt và hữu ích. Cảm ơn!
FrVaBe

0

Tin vui nhé các bạn. Việc triển khai trình trợ giúp dịch vụ có sẵn tại đây: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper Đó là một dự án mã nguồn mở (Apache 2). Tôi đang ở giai đoạn đầu của dự án. Tôi đã thực hiện một dự án mà tôi đã xác định mẫu để thực hiện, nhưng tôi vẫn chưa trích xuất mã để tạo hạn sử dụng thư viện sạch sẽ. Nó sẽ được thực hiện sớm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.