Virgil Dobjanschi REST 구현 패턴을 구현하는 샘플 Android REST 클라이언트 프로젝트가 필요합니다. getCompany(final String id); public List<Customer> getVipCompanies(); Virgil

안드로이드 폰에서 REST 클라이언트를 만들고 싶습니다.

REST 서버는 (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

나는 REST 서버와 대화하고 필요한 정보를 얻는 방법을 알고 있습니다. 이와 같은 API를 사용하여 REST 클라이언트 클래스를 구현합니다.

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();

Virgil Dobjanschi의 ” Developing Android REST client applications ” 프레젠테이션을 참조 하여 활동의 작업자 스레드에서 REST 요청을 처리하는 것은 좋지 않다는 것을 알게되었습니다. 대신 Service API를 사용해야합니다 .

(로컬) 서비스에 바인딩되는 Singleton ServiceHelper가 있다는 생각이 마음에 들지만 서비스 개념을 올바르게 이해하지 못한 것 같습니다.

지금은 REST 호출 결과 (서비스에서 비동기로 수행됨)를 호출자 활동에 다시보고하는 방법을 이해하지 못합니다. 또한 모든 REST 요청 (다른 반환 유형 포함)을 처리하는 ONE Service가 필요한지 아니면 각 REST 요청에 대한 전용 서비스가 필요한지 궁금합니다.

아마도 나는 다른 이해 문제가 많기 때문에 가장 좋은 것은 내 요구를 충족시키는 샘플 응용 프로그램 이 될 것입니다. 내 사용 사례는 드물지 않으며 예제 응용 프로그램이 있기를 바랍니다.

알려주세요!

올바른 구현 방향을 알려주는 다른 제안도 도움이됩니다 (Android API-Demo가 내 사용 사례와 일치하지 않음).

미리 감사드립니다.

클라우스

편집 : SO에서 발견 된 유사한 주제 (이 게시물을 게시 한 후)가 필요한 방향으로 안내합니다 (복잡한 “Dobjanschi 패턴”최소화) :



답변

오버뷰

편집하다:

관심있는 사람이라면 누구나 RESTful Android를 살펴 보는 것도 고려해 볼 수 있습니다.

Dobjanschi 모델을 구현하려는 경험에서 배운 것은 모든 것이 돌로 작성된 것은 아니며 앱에서 앱으로 변경 될 수있는 작업에 대한 개요 만 제공한다는 것입니다. 그러나 공식은 다음과 같습니다.

이 아이디어를 따르십시오 + 자신의 것을 추가하십시오 = 행복한 Android 애플리케이션

일부 앱의 모델은 요구 사항과 다를 수 있으며 일부는 SyncAdapter에 대한 계정이 필요하지 않을 수 있으며 다른 일부는 C2DM을 사용할 수 있습니다. 최근에 작업 한이 모델은 누군가에게 도움이 될 수 있습니다.


계정 및 AccountManager가있는 응용 프로그램 만들기

SyncAdapter를 사용하여 데이터를 동기화 할 수 있습니다. 이것은 자신의 SyncAdapter 만들기 에서 논의되었습니다.

ContentProvider 만들기 (필요한 경우)

이 추상화를 사용하면 데이터베이스에 액세스 할 수있을뿐만 아니라 REST Arch와 일대일 매핑 방법을 사용하므로 ServiceHelper로 이동하여 REST 호출을 실행할 수 있습니다.

콘텐츠 제공자 | REST 방법

쿼리 —————-> GET

삽입 —————-> PUT

업데이트 —————-> POST

삭제 —————-> DELETE

ServiceHelper 계층화

이 사람은 기본적으로 (a) ContentProvider에서 전달한 매개 변수를 사용하여 Http (반드시 프로토콜은 아니지만 가장 일반적인) REST 메서드를 실행하는 서비스를 시작합니다. 콘텐츠 공급자의 UriMatcher에서 가져온 일치 정수를 전달하여 액세스 할 REST 리소스를 알 수 있습니다.

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 
    }

}

서비스

실행되고 (대부분 IntentService를 사용합니다) 도우미에서 전달 된 매개 변수를 사용하여 RESTMethod로 이동합니다. 서비스는 백그라운드에서 실행하는 것이 좋습니다.

또한 BroadCastReceiver를 구현하여 서비스가 작업을 완료하면이 브로드 캐스트를 등록한 내 활동에 알리고 다시 쿼리하십시오. 저는이 마지막 단계가 Virgill Conference에있는 것이 아니라고 생각하지만 좋은 방법이라고 확신합니다.

RESTMethod 클래스

매개 변수를 취하면 WS 리소스 ( http://myservice.com/service/path )가 매개 변수를 추가하고 모든 것을 준비하고 호출을 실행하고 응답을 저장합니다.

authtoken이 필요한 경우 AccountManager에서 요청할 수 있습니다. 인증으로 인해 서비스 호출이 실패한 경우 authtoken을 무효화하고 다시 인증하여 새 토큰을 얻을 수 있습니다.

마지막으로 RESTMethod는 매처를 기반으로 프로세서를 만들고 응답을 전달하더라도 XML 또는 JSON을 제공합니다.

프로세서

응답을 구문 분석하고 로컬에 삽입하는 작업을 담당합니다.

샘플 애플리케이션? 물론이야!

또한 테스트 응용 프로그램에 관심이 있다면 Eli-G 를 살펴 보는 것이 가장 좋은 예는 아닐 수 있지만 Service REST 접근 방식을 따르며 ServiceHelper, Processor, ContentProvider, Loader 및 Broadcast로 빌드됩니다.


답변

Android 프로그래밍 에는 Virgil의 Google I / O 토크에서 ‘옵션 B : ContentProvider API 사용’에 대한 전체 장 (13. 콘텐츠 공급자 탐색)이 있습니다.

이 접근 방식의 이점을 보는 사람은 우리 뿐만이 아닙니다. 2010 년 5 월 Google I / O 컨퍼런스에서 Google의 Virgil Dobjanschi는 콘텐츠 제공 업체를 사용하여 RESTful 웹 서비스를 Android 애플리케이션에 통합하기위한 다음 세 가지 패턴을 설명하는 강연을 발표했습니다.

이 장에서는 두 번째 Finch 비디오 예제를 사용하여 두 번째 패턴을 자세히 살펴 보겠습니다. 이 전략은 애플리케이션에 여러 가지 중요한 이점을 제공합니다. 이 접근 방식은 네트워크 작업을 Android MVC에 통합하는 우아함으로 인해 ‘네트워크 MVC’라는 이름을 부여했습니다.

Android 프로그래밍의 향후 버전에서는 다른 두 가지 접근 방식을 다루고이 Google 프레젠테이션에 대한 자세한 내용을 문서화 할 수 있습니다. 이 장을 읽은 후에는 Google의 강연을 보는 것이 좋습니다.

추천.

Zigurd Mednieks, Laird Dornin, G. Blake Meike, Masumi Nakamura의 Android 프로그래밍. 저작권 2011 O’Reilly Media, Inc., 978-1-449-38969-7.


답변

Virgil Dobjanschi의 “Android REST 클라이언트 애플리케이션 개발”은 세션 중에 소스 코드가 제공되지 않았거나 이후에 제공되지 않았기 때문에 많은 논의로 이어졌습니다.

  • 참조 구현은 http://datadroid.foxykeep.com에서 사용할 수 있습니다 (Google IO 세션은 / presentation에서 언급 됨). 자신의 응용 프로그램에서 사용할 수있는 라이브러리입니다.
  • Android Priority Job Queue 는 Dobjanschi의 이야기에서 영감을 얻었으며 저에게 매우 유망한 것 같습니다.

더 많은 구현을 알고 있으면 의견을 말하십시오.


답변

우리는이 문제를 해결하는 라이브러리 인 RoboSpice 를 개발했습니다 .

이 라이브러리는 Virgil DobjanschiNeil Goodmann이 설명한 “서비스 접근 방식”을 사용 하지만 다음 과 같은 완벽한 올인원 솔루션을 제공합니다.

  • POJO를 반환 할 네트워크 요청 (예 : REST 요청)을 비동기 적으로 (백그라운드 AndroidService에서) 실행합니다.
  • 결과를 캐시합니다 (Json, Xml, 플랫 텍스트 파일 또는 이진 파일)
  • 네트워크 요청 결과가 아직 살아있는 경우 활동 (또는 기타 컨텍스트)에 알립니다.
  • 더 이상 살아 있지 않으면 결과를 알리지 않습니다.
  • UI 스레드에서 활동을 알립니다.
  • 간단하지만 강력한 예외 처리 모델을 사용합니다.
  • 다양한 웹 서비스 결과를 집계하기 위해 여러 ContentService를 지원합니다.
  • 요청 실행의 다중 스레딩 지원
  • 강력하게 입력되었습니다!
  • 오픈 소스입니다;)
  • 및 테스트

실제로 커뮤니티에서 피드백을 찾고 있습니다.


답변

Retrofit 은 여기에서 매우 유용 할 수 있으며 다음과 같은 매우 간단한 구성으로 어댑터를 구축합니다.

Retrofit은 REST API를 Java 인터페이스로 전환합니다.

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

RestAdapter 클래스는 GitHubService 인터페이스의 구현을 생성합니다.

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

GitHubService 서비스 = restAdapter.create (GitHubService.class); 생성 된 GitHubService에 대한 각 호출은 원격 웹 서버에 HTTP 요청을합니다.

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

자세한 내용은 공식 사이트를 방문하십시오 : http://square.github.io/retrofit/

참고 : RestAdapterRetrofit에서 얻은 어댑터 는 파생되지 않았습니다. BaseAdapter이 질문과 같이 래퍼를 만들어야합니다.
ListFragment 내에서 setListAdapter를 호출 한 후 내 ListView가 비어있는 이유는 무엇입니까?


답변

이것은 조금 늦었지만 다음은 강연의 첫 번째 패턴을 설명하는 기사입니다.

http://www.codeproject.com/Articles/429997/Sample-Implementation-of-Virgil-Dobjanschis-Rest-p

첫 번째 패턴에 대해 내가 좋아하는 점은 나머지 메서드에 대한 인터페이스가 일반 클래스이고 콘텐츠 공급자가 데이터베이스에 대한 액세스를 제공하기 위해 남겨진다는 것입니다.


답변

우선 Google의 공식 I / O 2010 앱 , 특히 SyncServiceio 하위 패키지 의 다양한 클래스에 대한 소스 코드를 확인해야합니다 .