नमूना Android REST क्लाइंट प्रोजेक्ट की आवश्यकता है जो Virgil Dobjanschi REST कार्यान्वयन पैटर्न को लागू करता है


82

मैं एक Android फोन पर एक अन्य ग्राहक बनाना चाहते हैं।

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

मुझे लगता है कि मुझे पता है कि आरईएसटी सर्वर से कैसे बात की जाए और मुझे जो जानकारी चाहिए वह मिल जाए। मैं इस तरह एक एपीआई के साथ एक अन्य ग्राहक वर्ग को लागू करेगा

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

विर्गिल डोबजान्स्की की प्रस्तुति " विकासशील एंड्रॉइड रीस्ट क्लाइंट एप्लिकेशन " के संदर्भ में मैंने सीखा कि गतिविधि के एक कार्यकर्ता थ्रेड में आरईएसटी अनुरोध को संभालना कोई अच्छा विचार नहीं है। इसके बजाय मुझे सेवा एपीआई का उपयोग करना चाहिए ।

मुझे एक सिंगलटन सर्विसहेलर होने का विचार पसंद है जो एक (स्थानीय) सेवा से जुड़ता है लेकिन मुझे डर है कि मुझे सेवा की अवधारणा सही नहीं लगी।

अभी के लिए मुझे यह समझ में नहीं आ रहा है कि कॉल गतिविधि के लिए एक REST कॉल परिणाम (किसी सेवा में असिंक्रोनस किया गया) की रिपोर्ट कैसे करें। मुझे आश्चर्य है कि अगर मुझे वन सेवा की आवश्यकता है जो सभी REST अनुरोधों (विभिन्न रिटर्न प्रकारों के साथ) को संभालती है या यदि मुझे प्रत्येक REST अनुरोध के लिए एक समर्पित सेवा की आवश्यकता है।

संभवतः मुझे कई अन्य समझने की समस्याएं हैं इसलिए मेरे लिए सबसे अच्छी बात एक नमूना अनुप्रयोग होगा जो मेरी आवश्यकताओं को पूरा करता है। मेरा उपयोग मामला असामान्य नहीं है और मुझे आशा है कि वहाँ उदाहरण के आवेदन में है।

क्या आप कृपया मुझे बताएंगे!

कोई अन्य सुझाव जो मुझे सही कार्यान्वयन दिशा में इंगित करते हैं, वे भी सहायक हैं (एंड्रॉइड एपीआई-डेमो मेरे उपयोग के मामले से मेल नहीं खाता)।

अग्रिम में धन्यवाद।

क्लाउस

संपादित करें : एसओ पर पाए गए इसी तरह के विषय (इसे पोस्ट करने के बाद) जो मुझे उस दिशा में ले जाते हैं जिसकी मुझे आवश्यकता है (जटिल "डोबाज़्ची पैटर्न" को कम से कम):


1
Claszen, क्या आपको प्रत्येक अनुरोध के लिए सभी अनुरोधों बनाम समर्पित सेवाओं के लिए एकल सेवा की कोई राय मिली है? अगर हाँ तो आप शेयर कर सकते हैं मेरे मामले में परिदृश्य: मेरे ऐप में उपयोग किए जाने के लिए मेरे पास बहुत से अनुरोध [20 के आसपास] हैं। मैंने ऊपर उल्लिखित Google I / O में मूल्यवान सत्र देखा है। मेरा प्रश्न यह है कि बेहतर दृष्टिकोण कौन सा है। एकल सेवा में सभी अनुरोधों को संभालने के लिए एकल सेवा है? या अनुरोधों में से प्रत्येक के लिए एक समर्पित सेवा है? मेरे कुछ अनुरोध हैं जिन्हें क्रमिक रूप से निकाल दिया जाना चाहिए और उनमें से कुछ को एक साथ निकाल दिया जा सकता है। कोई सुझाव ?

@ user778869 मैंने अंत में प्रत्येक ('शीर्ष स्तर') REST संसाधन (जैसे 'कंपनी', 'ग्राहक') के लिए एक इंटेंससेवा और परिणाम सूची का उपयोग किया। मैंने पाया कि यह एक तरह की 'प्राकृतिक' संरचना है और अच्छी तरह से काम करती है। यह कुछ कोड दोहराव पैदा कर सकता है, लेकिन अगर यह एक सेवा में किया जाता है तो नियंत्रण संरचनाओं के बहुत भारी उपयोग से बचाता है।
FrVaBe

Android REST क्लाइंट कार्यान्वयन सीखने वाले लोगों के लिए यह बहुत उपयोगी हो सकता है। Dobjanschi की प्रस्तुति एक पीडीएफ में प्रसारित की गई: drive.google.com/file/d/0B2dn_3573C3RdlVpU2JBWXdSb3c/…
Kay Zed

जवाबों:


50

अवलोकन

संपादित करें:

कोई भी रुचि Restful Android पर एक नज़र लेने पर विचार करती है, इससे आपको इसके बारे में बेहतर जानकारी मिल सकती है।

मैंने डोबजानस्की मॉडल को लागू करने की कोशिश करने पर अनुभव से जो सीखा है, वह यह है कि सब कुछ पत्थर में नहीं लिखा गया है और वह आपको केवल यह बताता है कि ऐसा करने के लिए आपको क्या करना चाहिए यह ऐप से ऐप में बदल सकता है लेकिन सूत्र है:

इस विचार का पालन करें + अपना खुद का = हैप्पी एंड्रॉइड एप्लिकेशन जोड़ें

कुछ एप्लिकेशन पर मॉडल आवश्यकता से भिन्न हो सकता है कुछ को सिंक एडेप्टर के लिए खाते की आवश्यकता नहीं हो सकती है अन्य C2DM का उपयोग कर सकते हैं, यह वह है जो मैंने हाल ही में काम किया है जो किसी की मदद कर सकता है:


एक एप्लिकेशन बनाएं जिसमें खाता और खाता प्रबंधक हो

यह आपको अपने डेटा को सिंक्रनाइज़ करने के लिए SyncAdapter का उपयोग करने की अनुमति देगा। इस पर Create your own SyncAdapter पर चर्चा की गई है

एक ContentProvider बनाएं (यदि यह आपकी आवश्यकताओं के अनुरूप है)

यह अमूर्तता आपको न केवल डेटाबेस तक पहुँचने की अनुमति देती है, बल्कि REST कॉल को निष्पादित करने के लिए ServiceHelper तक जाती है क्योंकि इसमें REST आर्क के साथ एक-प्रति-एक मैपिंग विधि है।

सामग्री प्रदाता | अन्य विधि

क्वेरी ----------------> GET

डालें ----------------> PUT

अद्यतन ----------------> पोस्ट

हटाएँ ----------------> DELETE

ServiceHelper लेयरिंग

यह आदमी मूल रूप से एक (एच) सेवा शुरू करेगा जो एक एचटीपी को निष्पादित करता है (जरूरी नहीं कि प्रोटोकॉल लेकिन यह सबसे आम है) पैरामीटर जो कि आप ContentProvider से गुजरते हैं, के साथ 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 को सहायक से पारित किए गए पैरामेट्स के साथ जाता है, इसके लिए क्या अच्छा है? अच्छी तरह से याद रखें कि सेवा पृष्ठभूमि में चीजों को चलाने के लिए अच्छी है।

साथ ही एक ब्रॉडकैस्टराइवर भी लागू करें ताकि जब सेवा अपने काम के साथ हो जाए तो मेरी गतिविधि को सूचित करें जिसने इस प्रसारण और आवश्यकता को फिर से पंजीकृत किया। मेरा मानना ​​है कि यह आखिरी कदम वर्जिल सम्मेलन पर नहीं है, लेकिन मुझे पूरा यकीन है कि यह एक अच्छा तरीका है।

RESTMethod वर्ग

पैरामीटर लेता है, WS संसाधन ( http://myservice.com/service/path ) पैरामीटर जोड़ता है, सब कुछ तैयार करता है, कॉल निष्पादित करता है, और प्रतिक्रिया को बचाता है।

यदि ऑर्ट्टोकेन की आवश्यकता है, तो आप खाता प्रबंधक से अनुरोध कर सकते हैं। यदि प्रमाणीकरण के कारण सेवा की कॉलिंग विफल हो गई है, तो आप नए टोकन प्राप्त करने के लिए ऑर्टटोकन और reauth को अमान्य कर सकते हैं।

अंत में RESTMethod मुझे XML या JSON देता है, इससे कोई फर्क नहीं पड़ता कि मैं मिलान के आधार पर एक प्रोसेसर बनाता हूं और प्रतिक्रिया पास करता हूं।

प्रोसेसर

यह प्रतिक्रिया को पार्स करने और स्थानीय रूप से सम्मिलित करने के आरोप में है।

एक नमूना आवेदन? बेशक!

इसके अलावा, यदि आप एली-जी को देखने वाले परीक्षण एप्लिकेशन पर दिलचस्प हैं , तो यह सबसे अच्छा उदाहरण नहीं हो सकता है, लेकिन यह सेवा रीस्ट दृष्टिकोण का पालन करता है, इसे सर्विस हेल्पर, प्रोसेसर, कंटेंटप्रोवाइडर, लोडर और ब्रॉडकास्ट के साथ बनाया गया है।


आपके उत्तर के लिए धन्यवाद। मैंने अंत में प्रत्येक ('शीर्ष स्तर') REST संसाधन (जैसे 'कंपनी', 'ग्राहक') के लिए एक IntentService और ResultReceiver का उपयोग किया। मेरे लिए डोबजानस्की मॉडल बहुत भारी था।
FrVaBe

IntentService का उपयोग करते हुए अच्छी तरह से बी और आप शायद पहले वर्णन परिदृश्य का उपयोग कर रहे हैं जो एक सेवा-चालित मॉडल है, हालांकि वह संचार के लिए ResultReceiver के बजाय Binder का उपयोग करता है, लेकिन यह अच्छा है जैसा कि मैंने कहा कि पत्थर में नहीं लिखा गया है।
नेक्रोनैट

यह कुछ समय पहले है कि मैंने सवाल पूछा और मुझे एक समाधान मिला जो मेरे लिए फिट था। मुझे नमूना अनुप्रयोगों के सभी संदर्भों की जांच करने की संभावना नहीं थी - लेकिन जैसा कि यह शीर्ष सबसे अद्यतन उत्तर है मैं इसे स्वीकार करूंगा। फिर भी मैं अन्य सभी उत्तरों की भी जाँच करने की सलाह देता हूँ।
FrVaBe

एक्सेलेंट सक्सेशन, सभी उत्तर की जांच करें, उन सभी में बहुत अच्छे संसाधन और विचार हैं !! जेरेमी जैसे प्रोग्रामिंग एंड्रॉइड पुस्तक के साथ Yoni iosched स्रोत के साथ।
नेक्रोनैट

@Necronet हाय वहाँ, बस अपने होनहार नमूना ऐप पर ठोकर खाई - हालांकि, मुझे इसके निर्माण में परेशानी हो रही है। क्या आप हमें बताएंगे कि ActionBarSherlock का कौन सा संस्करण इसके खिलाफ बनाया गया है (ऐसा लगता है कि यह w / नवीनतम ABS 4.1 काम नहीं करता है)? इसके अलावा, आपके पोस्ट से मुझे वास्तव में यह पता नहीं चला कि आप किस उद्देश्य के लिए डॉजांशी के मॉडल (ए, बी या सी) का पता लगा रहे थे (मुझे पता है, आप शायद डब्ल्यू / कुछ बदलावों को समाप्त कर चुके हैं, लेकिन मुझे लगता है कि आप मुख्य रूप से किसी एक पर ध्यान केंद्रित कर रहे थे। पैटर्न - मुझे लगता है कि पैटर्न बी?) धन्यवाद!
वायोमाइक

17

प्रोग्रामिंग एंड्रॉइड का एक पूरा अध्याय है (विर्जिन के Google I / O टॉक से 'विकल्प B: कॉन्टेंटप्रोवाइडर API का उपयोग करें' के लिए समर्पित सामग्री का विवरण)।

हम केवल वही नहीं हैं जो इस दृष्टिकोण का लाभ देखते हैं। मई 2010 में Google I / O सम्मेलन में, Google के Virgil Dobjanschi ने एक बात प्रस्तुत की, जिसमें Android एप्लिकेशन में Restful वेब सेवाओं को एकीकृत करने के लिए सामग्री प्रदाताओं का उपयोग करने के लिए निम्नलिखित तीन पैटर्न की रूपरेखा दी गई है ...

इस अध्याय में, हम अपने दूसरे फिंच वीडियो उदाहरण के साथ दूसरे पैटर्न का विस्तार से पता लगाएंगे; यह रणनीति आपके अनुप्रयोगों के लिए कई महत्वपूर्ण लाभ देगी। लालित्य के कारण जिसके साथ यह दृष्टिकोण एंड्रॉइड एमवीसी में नेटवर्क संचालन को एकीकृत करता है, हमने इसे "नेटवर्क एमवीसी" नाम दिया है।

प्रोग्रामिंग एंड्रॉइड का एक भविष्य का संस्करण अन्य दो दृष्टिकोणों को संबोधित कर सकता है, साथ ही साथ इस Google प्रस्तुति के अधिक विवरण को भी दस्तावेज़ित कर सकता है। इस अध्याय को पढ़ने के बाद, हमारा सुझाव है कि आप Google की बात देखें।

अत्यधिक सिफारिशित।

Zigurd Mednieks, Laird Dornin, G. Blake Meike, और Masumi नाकामुरा द्वारा एंड्रॉइड प्रोग्रामिंग। कॉपीराइट 2011 ओ रेली मीडिया, इंक।, 978-1-449-38969-7।


11

वर्जिल डोबजंसी द्वारा "एंड्रॉइड रीस्ट क्लाइंट एप्लिकेशन विकसित करना" बहुत चर्चा का कारण बना, क्योंकि सत्र के दौरान कोई स्रोत कोड प्रस्तुत नहीं किया गया था या बाद में प्रदान किया गया था।

  • एक संदर्भ कार्यान्वयन http://datadroid.foxykeep.com (Google IO सत्र / प्रस्तुति के तहत उल्लेख किया गया है) के तहत उपलब्ध है। यह एक पुस्तकालय है जिसे आप अपने स्वयं के अनुप्रयोग में उपयोग कर सकते हैं।
  • एंड्रॉइड प्रायोरिटी जॉब क्यूब, डोबजानस्की की बात से प्रेरित था और मुझे बहुत आशाजनक लगता है।

यदि आप अधिक कार्यान्वयन जानते हैं तो कृपया टिप्पणी करें।


इसे संभवतः उपयोगी लिंक साझा करने के लिए धन्यवाद (पल में गहराई से देखने का मौका न दें)
FrVaBe

जो एक समाधान की तरह दिखता है। धन्यवाद !
विंसेंट कैंटिन

7

हमने एक पुस्तकालय विकसित किया है जो इस मुद्दे को स्वीकार करता है : रोबोस्पाइस

लाइब्रेरी में विर्गिल डोबजान्स्की और नील गुडमैन द्वारा वर्णित "सेवा दृष्टिकोण" का उपयोग किया जाता है , लेकिन हम एक संपूर्ण ऑल-इन-वन समाधान प्रदान करते हैं:

  • एसिंक्रोनस रूप से निष्पादित करता है (एक पृष्ठभूमि AndroidService में) नेटवर्क अनुरोध जो POJOs लौटाएगा (उदा: REST अनुरोध)
  • कैश परिणाम (Json, या Xml, या फ्लैट पाठ फ़ाइलों, या बाइनरी फ़ाइलों में)
  • यदि वे अभी भी जीवित हैं, तो नेटवर्क अनुरोध के परिणामस्वरूप आपकी गतिविधियों (या किसी अन्य संदर्भ) को सूचित करता है
  • यदि वे अब जीवित नहीं हैं तो परिणाम की अपनी गतिविधियों को सूचित न करें
  • अपने UI थ्रेड पर अपनी गतिविधियों को सूचित करता है
  • एक सरल लेकिन मजबूत अपवाद हैंडलिंग मॉडल का उपयोग करता है
  • विभिन्न वेब सेवाओं के परिणामों को एकत्रित करने के लिए कई ContentServices का समर्थन करता है
  • अनुरोध निष्पादन के बहु-सूत्रण का समर्थन करता है
  • दृढ़ता से टाइप किया गया है!
  • खुला स्रोत है;)
  • और परीक्षण किया गया

हम वास्तव में समुदाय से प्रतिक्रिया की तलाश कर रहे हैं।


4

रेट्रोफिट यहां बहुत मददगार हो सकता है, यह आपके लिए बहुत ही सरल कॉन्फ़िगरेशन से एक एडेप्टर बनाता है जैसे:

रेट्रोफिट आपके REST API को जावा इंटरफेस में बदल देता है।

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/

नोट : RestAdapterआप जिस एडॉप्टर से रेट्रोफिट प्राप्त करते हैं वह BaseAdapterआप से नहीं लिया गया है , इसके लिए किसी तरह का आवरण बनाना चाहिए, जैसे एसओ प्रश्न। लिस्टफ्रेगमेंट के अंदर सेटलिस्टैप एडाप्टर को कॉल करने के बाद मेरा लिस्ट व्यू खाली क्यों है?


क्या आप api.icndb.com/jokes/random
exequielc

3

यह थोड़ा देर से है, लेकिन यहां एक लेख है जो बात से पहला पैटर्न बताता है:

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

पहले पैटर्न के बारे में मुझे जो बात पसंद है वह यह है कि बाकी तरीकों के लिए इंटरफ़ेस एक सादा वर्ग है, और सामग्री प्रदाता को बस डेटाबेस तक पहुंच प्रदान करने के लिए छोड़ दिया जाता है।


3

आपको Google के आधिकारिक I / O 2010 ऐप के स्रोत कोड की शुरुआत करनी चाहिए , शुरुआत के लिए, विशेष रूप से SyncService और io उपपैक में विभिन्न वर्गों के लिए ।


+1 वास्तव में मेरा उपयोग मामला नहीं है, लेकिन किसी भी मामले में एक अच्छा और उपयोगी एंड्रॉइड एप्लिकेशन उदाहरण है। धन्यवाद!
FrVaBe

0

अच्छी खबर है दोस्तों। सेवा सहायक का एक कार्यान्वयन यहां उपलब्ध है: https://github.com/MathiasSeguy-Android2EE/MythicServiceHelper यह एक ओपन सोर्स प्रोजेक्ट है (Apache 2)। मैं प्रोजेक्ट की शुरुआत में हूं। मैंने एक परियोजना की है जहाँ मैंने करने के लिए पैटर्न को परिभाषित किया है, लेकिन मैंने अभी तक एक स्वच्छ लीब्राएरी बनाने के लिए कोड नहीं निकाला है। इसे जल्द ही किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.