Android बाकी ग्राहक, नमूना?


115

यहां तक ​​कि अगर इस धागे ने जवाब स्वीकार कर लिया है, तो अन्य विचारों का प्रस्ताव करने के लिए स्वतंत्र महसूस करें, आप उपयोग या पसंद करते हैं


मुझे ये लेख मिले हैं:

और वह मुझे इस Google I / O 2010 वीडियो को REST क्लाइंट अनुप्रयोगों के बारे में बताता है

अब से, मैं अपने अनुप्रयोग नियंत्रक वर्ग में स्थैतिक घटक के रूप में अन्य घटक बना रहा हूँ।

अब से, मुझे लगता है, मुझे पैटर्न बदलना चाहिए। किसी ने बताया कि Google IOSched आवेदन एंड्रॉइड पर REST क्लाइंट लिखने के तरीके का एक बड़ा नमूना है। किसी और ने बताया कि यह तरीका बहुत ज़्यादा है।

तो, क्या कोई हमें यह दिखा सकता है कि सबसे अच्छा अभ्यास क्या है? संक्षिप्त और सरल तरीके से।
नमूना उपयोग के मामले में IOSched आवेदन बहुत जटिल है।


नमस्कार, आम तौर पर मैं "ws" नाम की वेब सेवा के लिए अलग पैकेज विकसित करता हूं, मेरे पास "WebServicUtils.java" नाम का सामान्य वर्ग है। WebServiceUtils.java वर्ग में वेब सेवा तक पहुँचने के तरीके हैं। मुझे यकीन नहीं है कि मेरी तकनीक सबसे अच्छी है या नहीं, लेकिन यह हर बार पुन: प्रयोज्य है जब मैं एंड्रॉइड एप्लिकेशन में अपने ws पैकेज की प्रतिलिपि बनाता हूं, तो मुझे बताएं कि क्या आप मेरी तकनीक के बारे में अधिक जानना चाहते हैं।
केतन परमार

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

एक साइड नोट के रूप में, एंड्रॉइड के लिए एक ओपन-सोर्स एक्लिप्स प्लगइन, मैकेनाइड, एक साधारण डीएसएल का उपयोग करके JSON-REST क्लाइंट उत्पन्न कर सकता है, इसे कैसे उपयोग किया जाए, इस पर एक गाइड, यहां पाया जा सकता है robotoworks.com/mechanoid-plugin/service-client-dsl (मैं इस प्लगइन का लेखक हूँ, बेशर्म प्लग के लिए खेद है!)
इयान वारविक

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

जवाबों:


99

EDIT 2 (अक्टूबर 2017):

यह 2017 है। बस रेट्रोफिट का उपयोग करें। कुछ और उपयोग करने का लगभग कोई कारण नहीं है।

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

इस एडिट के समय मूल उत्तर डेढ़ साल से अधिक पुराना है। यद्यपि मूल उत्तर में प्रस्तुत अवधारणाएं अभी भी पकड़ में हैं, क्योंकि अन्य उत्तर इंगित करते हैं, अब वहाँ पुस्तकालय हैं जो इस कार्य को आपके लिए आसान बनाते हैं। इससे भी महत्वपूर्ण बात, इन पुस्तकालयों में से कुछ आपके लिए डिवाइस कॉन्फ़िगरेशन परिवर्तन को संभालते हैं।

मूल उत्तर को संदर्भ के लिए नीचे रखा गया है। लेकिन कृपया यह भी देखें कि एंड्रॉइड के कुछ रेस्ट क्लाइंट पुस्तकालयों की जांच के लिए यह देखने के लिए कि क्या वे आपके उपयोग के मामलों में फिट हैं। निम्नलिखित उन कुछ पुस्तकालयों की सूची है जिनका मैंने मूल्यांकन किया है। यह किसी भी तरह से एक संपूर्ण सूची नहीं है।


मूल उत्तर:

Android पर REST क्लाइंट रखने के लिए मेरा दृष्टिकोण प्रस्तुत करना। मैं यह दावा नहीं करता कि यह सबसे अच्छा है :) इसके अलावा, ध्यान दें कि यह वही है जो मैं अपनी आवश्यकता के जवाब में आया था। यदि आपके उपयोग के मामले की मांग है, तो आपको और अधिक परतें / अधिक जटिलताएं जोड़ने की आवश्यकता हो सकती है। उदाहरण के लिए, मेरे पास स्थानीय भंडारण नहीं है; क्योंकि मेरा ऐप कुछ REST प्रतिक्रियाओं के नुकसान को सहन कर सकता है।

मेरा दृष्टिकोण AsyncTaskकवर के तहत सिर्फ एस का उपयोग करता है । मेरे मामले में, मैं अपने Activityउदाहरण से इन कार्यों को "कॉल" करता हूं ; लेकिन स्क्रीन रोटेशन जैसे मामलों के लिए पूरी तरह से खाते में, आप उन्हें ए से कॉल करना चुन सकते हैंService या ऐसे ।

मैंने सचेत रूप से अपने REST क्लाइंट को API के रूप में चुना। इसका मतलब है, कि जो ऐप मेरे REST क्लाइंट का उपयोग करता है, उसे वास्तविक REST URL और डेटा प्रारूप का उपयोग करने की भी जानकारी नहीं होनी चाहिए।

क्लाइंट की 2 परतें होंगी:

  1. शीर्ष परत: इस परत का उद्देश्य उन तरीकों को प्रदान करना है जो REST API की कार्यक्षमता को प्रतिबिंबित करते हैं। उदाहरण के लिए, आप अपने REST API में प्रत्येक URL के अनुरूप एक जावा विधि (या यहां तक ​​कि दो - GET के लिए एक और POST के लिए एक) रख सकते हैं।
    यह REST क्लाइंट API में प्रवेश बिंदु है। यह वह परत है जिसे ऐप सामान्य रूप से उपयोग करेगा। यह एक सिंगलटन हो सकता है, लेकिन जरूरी नहीं।
    REST कॉल की प्रतिक्रिया को इस परत द्वारा POJO में पार्स किया जाता है और ऐप पर वापस आ जाता है।

  2. यह निचले स्तर की AsyncTaskपरत है, जो वास्तव में बाहर जाने और उस कॉल को करने के लिए HTTP क्लाइंट विधियों का उपयोग करती है।

इसके अलावा, मैंने के परिणाम को संप्रेषित करने के लिए एक कॉलबैक तंत्र का उपयोग करने के लिए चुना AsyncTask ऐप पर वापस जाने के ।

पाठ का पर्याप्त। अब कुछ कोड देखते हैं। आइए एक काल्पनिक REST API URL लें - http://myhypotheticalapi.com/user/profile

शीर्ष परत इस तरह दिख सकती है:

   /**
 * Entry point into the API.
 */
public class HypotheticalApi{   
    public static HypotheticalApi getInstance(){
        //Choose an appropriate creation strategy.
    }
    
    /**
     * Request a User Profile from the REST server.
     * @param userName The user name for which the profile is to be requested.
     * @param callback Callback to execute when the profile is available.
     */
    public void getUserProfile(String userName, final GetResponseCallback callback){
        String restUrl = Utils.constructRestUrlForProfile(userName);
        new GetTask(restUrl, new RestTaskCallback (){
            @Override
            public void onTaskComplete(String response){
                Profile profile = Utils.parseResponseAsProfile(response);
                callback.onDataReceived(profile);
            }
        }).execute();
    }
    
    /**
     * Submit a user profile to the server.
     * @param profile The profile to submit
     * @param callback The callback to execute when submission status is available.
     */
    public void postUserProfile(Profile profile, final PostCallback callback){
        String restUrl = Utils.constructRestUrlForProfile(profile);
        String requestBody = Utils.serializeProfileAsString(profile);
        new PostTask(restUrl, requestBody, new RestTaskCallback(){
            public void onTaskComplete(String response){
                callback.onPostSuccess();
            }
        }).execute();
    }
}


/**
 * Class definition for a callback to be invoked when the response data for the
 * GET call is available.
 */
public abstract class GetResponseCallback{
    
    /**
     * Called when the response data for the REST call is ready. <br/>
     * This method is guaranteed to execute on the UI thread.
     * 
     * @param profile The {@code Profile} that was received from the server.
     */
    abstract void onDataReceived(Profile profile);
    
    /*
     * Additional methods like onPreGet() or onFailure() can be added with default implementations.
     * This is why this has been made and abstract class rather than Interface.
     */
}

/**
 * 
 * Class definition for a callback to be invoked when the response for the data 
 * submission is available.
 * 
 */
public abstract class PostCallback{
    /**
     * Called when a POST success response is received. <br/>
     * This method is guaranteed to execute on the UI thread.
     */
    public abstract void onPostSuccess();

}

ध्यान दें कि ऐप सीधे JSON या XML (या जो भी अन्य प्रारूप) का उपयोग नहीं करता है, वह सीधे REST API द्वारा लौटाया जाता है। इसके बजाय, ऐप केवल बीन को देखता है Profile

फिर, निचली परत (AsyncTask परत) इस तरह दिख सकती है:

/**
 * An AsyncTask implementation for performing GETs on the Hypothetical REST APIs.
 */
public class GetTask extends AsyncTask<String, String, String>{
    
    private String mRestUrl;
    private RestTaskCallback mCallback;
    
    /**
     * Creates a new instance of GetTask with the specified URL and callback.
     * 
     * @param restUrl The URL for the REST API.
     * @param callback The callback to be invoked when the HTTP request
     *            completes.
     * 
     */
    public GetTask(String restUrl, RestTaskCallback callback){
        this.mRestUrl = restUrl;
        this.mCallback = callback;
    }
    
    @Override
    protected String doInBackground(String... params) {
        String response = null;
        //Use HTTP Client APIs to make the call.
        //Return the HTTP Response body here.
        return response;
    }
    
    @Override
    protected void onPostExecute(String result) {
        mCallback.onTaskComplete(result);
        super.onPostExecute(result);
    }
}

    /**
     * An AsyncTask implementation for performing POSTs on the Hypothetical REST APIs.
     */
    public class PostTask extends AsyncTask<String, String, String>{
        private String mRestUrl;
        private RestTaskCallback mCallback;
        private String mRequestBody;
        
        /**
         * Creates a new instance of PostTask with the specified URL, callback, and
         * request body.
         * 
         * @param restUrl The URL for the REST API.
         * @param callback The callback to be invoked when the HTTP request
         *            completes.
         * @param requestBody The body of the POST request.
         * 
         */
        public PostTask(String restUrl, String requestBody, RestTaskCallback callback){
            this.mRestUrl = restUrl;
            this.mRequestBody = requestBody;
            this.mCallback = callback;
        }
        
        @Override
        protected String doInBackground(String... arg0) {
            //Use HTTP client API's to do the POST
            //Return response.
        }
        
        @Override
        protected void onPostExecute(String result) {
            mCallback.onTaskComplete(result);
            super.onPostExecute(result);
        }
    }
    
    /**
     * Class definition for a callback to be invoked when the HTTP request
     * representing the REST API Call completes.
     */
    public abstract class RestTaskCallback{
        /**
         * Called when the HTTP request completes.
         * 
         * @param result The result of the HTTP request.
         */
        public abstract void onTaskComplete(String result);
    }

यहां बताया गया है कि कोई एप्लिकेशन API का उपयोग कैसे कर सकता है ( Activityया में Service):

HypotheticalApi myApi = HypotheticalApi.getInstance();
        myApi.getUserProfile("techie.curious", new GetResponseCallback() {

            @Override
            void onDataReceived(Profile profile) {
                //Use the profile to display it on screen, etc.
            }
            
        });
        
        Profile newProfile = new Profile();
        myApi.postUserProfile(newProfile, new PostCallback() {
            
            @Override
            public void onPostSuccess() {
                //Display Success
            }
        });

मुझे उम्मीद है कि टिप्पणियां डिजाइन को समझाने के लिए पर्याप्त हैं; लेकिन मुझे अधिक जानकारी प्रदान करने में खुशी होगी।


मुझे यह उत्तर काफी अच्छा कोड के उदाहरणों के कारण अधिक पसंद है। धन्यवाद
मारेक Sebera

1
शायद कुछ भी नहीं, यह वास्तव में एक उचित रेस्टफुल MVC पैटर्न का पालन नहीं करता है, जैसा कि वर्जिल डोबजान्स्की द्वारा वर्णित है। आपको एक पूर्ण ContentProvider परत को शामिल करना होगा, जो कि SQLite डेटाबेस का उपयोग करता है जिसे ऐप सीधे उपयोग करता है। अन्यथा, यह Android के लिए एक अच्छा, हल्का REST क्लाइंट है।
कूपर

1
एक छोटी सी बात, आपको
Mo Kargas

1
यह वास्तव में बहुत अच्छा है। मैं GetResponseCallback को और अधिक सामान्य कैसे बनाऊंगा, इसलिए यह केवल एक प्रोफ़ाइल वापस पारित नहीं करता है, या क्या आप API से प्रत्येक प्रकार के डेटा के लिए एक अलग GetResponseCallback बनाने का सुझाव देंगे?

1
@MichaelHerbig हाँ, GetResponseCallbackअधिक सामान्य बनाने के तरीके हैं । मैं जो पसंद करता हूं वह एक मार्कर इंटरफ़ेस का उपयोग करना है : interface IGetResopnse{} सभी वर्गों को निरूपित करना जैसा कि प्रतिक्रियाएं हो सकती हैं। फिर, मेरे पास है class Profile implements IGetResponseआदि अंत में, बनाने के GetResponseCallbackसाथ सामान्य IGetResponseरूप में ऊपरी बाध्य : public abstract class GetResponseCallback<? extends IGetResponse>
क्युरीटैक्शैनिज़ेन

11

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

केवल संदर्भ कार्यान्वयन मुझे पता है (कृपया टिप्पणी करें यदि आप अधिक जानते हैं) डेटाड्रोइड पर उपलब्ध है (Google IO सत्र का उल्लेख / प्रस्तुति के तहत किया गया है)। यह एक पुस्तकालय है जिसे आप अपने स्वयं के अनुप्रयोग में उपयोग कर सकते हैं।

दूसरा लिंक "सर्वश्रेष्ठ" रीस्ट फ्रेमवर्क के लिए पूछता है, जिसकी स्टैकओवरफ्लो पर भारी चर्चा की गई है। मेरे लिए आवेदन का आकार महत्वपूर्ण है, कार्यान्वयन के प्रदर्शन के बाद।

  • आम तौर पर मैं सादे org.json implemantation का उपयोग करता हूं, जो एपीआई स्तर 1 के बाद से एंड्रॉइड का हिस्सा है और इसलिए एप्लिकेशन आकार में वृद्धि नहीं करता है।
  • मेरे लिए बहुत दिलचस्प JSON पार्सर्स के प्रदर्शन पर मिली जानकारी थी टिप्पणियों में : Android 3.0 हनीकॉम्ब के रूप में, GSON का स्ट्रीमिंग पार्सर android.util.JsonReader के रूप में शामिल है। दुर्भाग्य से, टिप्पणियाँ किसी भी अधिक उपलब्ध नहीं हैं।
  • स्प्रिंग एंड्रॉइड (जो मैं कभी-कभी उपयोग करता हूं) जैक्सन और जीएसओएन का समर्थन करता है। स्प्रिंग एंड्रॉयड RestTemplate मॉड्यूल प्रलेखन एक अंक नमूना एप्लिकेशन

इसलिए मैं जटिल परिदृश्यों के लिए org.json या GSON से चिपकता हूं। Org.json कार्यान्वयन की वास्तुकला के लिए, मैं एक स्थिर वर्ग का उपयोग कर रहा हूं जो सर्वर उपयोग के मामलों का प्रतिनिधित्व करता है (जैसे कि findPerson, getterson)। मैं इस कार्यक्षमता को एक सेवा से कॉल करता हूं और उपयोगिता वर्गों का उपयोग करता हूं जो मैपिंग (प्रोजेक्ट विशिष्ट) और नेटवर्क IO (सादे GET या POST के लिए मेरा स्वयं का टेम्पलेट) कर रहे हैं। मैं प्रतिबिंब के उपयोग से बचने की कोशिश करता हूं।


4
ओ'रेली पुस्तक, प्रोग्रामिंग एंड्रॉइड में डोबजान्स्की के रेस्टफुल एमवीसी पैटर्न (अध्याय 12-13) के पूर्ण कार्यान्वयन की सुविधा है।
कूपर

संकेत के लिए धन्यवाद: मैंने अमेज़ॅन पर यह कथन पाया: "अध्याय 12 और सामग्री प्रदाताओं के साथ 13 सौदा। उदाहरण के कोड के साथ सामग्री प्रदाताओं के व्यापक उपचार और एक नमूना आवेदन ने मुझे कई नई अंतर्दृष्टि प्रदान की कि यह तकनीक कैसे काम करती है, और यह कैसे हो सकती है वास्तविक प्रोग्रामिंग स्थितियों में उपयोग किया जा सकता है। यूआरआई का उपयोग करके डेटा को संग्रहीत करने और संदर्भित करने के लिए सामग्री प्रदाता फ्रेमवर्क एंड्रॉइड ऑपरेटिंग सिस्टम की उपन्यास विशेषताओं में से एक है। प्रौद्योगिकी कदम को समझाने में महान काम! "
क्लीप

2
कोड github.com/bmeike/ProgrammingAndroid2Examples पर है (लेकिन अध्याय गायब हैं, आप उन्हें पहले संस्करण कोड github.com/bmeike/ProgrammingAndroidExamples
ChrLipp

क्या कोई इस कोड को ICS + पर चला पा रहा है? FinchVideo उदाहरण के तहत टूडू फ़ाइल में पर्याप्त रूप से कहा गया है "- ICS के तहत क्रैश"। कोड के उदाहरणों को खोजने के लिए पुस्तक खरीदने के बाद मैं कुछ निराश हो गया था ...
23

7

नेटवर्क अनुरोध या जो कुछ भी करने की आवश्यकता है उसे करने के लिए कभी भी एसिंनस्क का उपयोग न करें। Async टास्क दृढ़तापूर्वक आपकी गतिविधि से जुड़ा हुआ है और यदि उपयोगकर्ता स्क्रीन के ओरिएंटेशन को बदल देता है क्योंकि App को फिर से बनाया गया है तो AsyncTask को रोक दिया जाएगा।

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


3

बहुत क्लीनर एपीआई और टाइप-सेफ डेटा के साथ एक और लाइब्रेरी है। https://github.com/kodart/Httpzoid

यहाँ एक सरल उपयोग उदाहरण है

Http http = HttpFactory.create(context);
http.post("http://example.com/users")
    .data(new User("John"))
    .execute();

या कॉलबैक के साथ अधिक जटिल

Http http = HttpFactory.create(context);
http.post("http://example.com/users")
    .data(new User("John"))
    .handler(new ResponseHandler<Void>() {
        @Override
        public void success(Void ignore, HttpResponse response) {
        }

        @Override
        public void error(String message, HttpResponse response) {
        }

        @Override
        public void failure(NetworkError error) {
        }

        @Override
        public void complete() {
        }
    }).execute();

यह नया है, लेकिन बहुत आशाजनक है।


यह AsyncTask पर चल रहा है, जो लंबे समय से चल रहे अनुरोधों और गतिविधियों के बीच स्विच के लिए अच्छा नहीं है, क्योंकि गतिविधि से बाहर निकलने पर AsyncTask को मार दिया जाएगा।
मलयासीज़

1

वहाँ बहुत सारे पुस्तकालय हैं और मैं इसका उपयोग कर रहा हूँ: https://github.com/nerde/rest-resource । यह मेरे द्वारा बनाया गया था, और, जैसा कि आप प्रलेखन में देख सकते हैं, यह अन्य लोगों की तुलना में क्लीनर और सरल है। यह एंड्रॉइड पर केंद्रित नहीं है, लेकिन मैं इसमें उपयोग कर रहा हूं और यह बहुत अच्छा काम कर रहा है।

यह HTTP बेसिक ऑथेंट को सपोर्ट करता है। यह JSON ऑब्जेक्ट्स को क्रमबद्ध और डिसेर्बलाइज़ करने का गंदा काम करता है। आप इसे पसंद करेंगे, खासकर अगर आपका एपीआई रेल की तरह है।


1

अस्वीकरण: मैं rest2mobile ओपन सोर्स प्रोजेक्ट में शामिल हूं

REST क्लाइंट के रूप में एक अन्य विकल्प rest2mobile का उपयोग करना है

REST सेवा के लिए क्लाइंट कोड जनरेट करने के लिए ठोस बाकी उदाहरणों का उपयोग करने के लिए दृष्टिकोण थोड़ा अलग है । कोड REST URL और JSON पेलोड को मूल जावा विधियों और POJO से बदल देता है। यह JSON रूपांतरणों से स्वचालित रूप से सर्वर कनेक्शन, एसिंक्रोनस इनवोकेशन और POJO / को भी हैंडल करता है।

ध्यान दें कि यह उपकरण विभिन्न स्वादों (क्ली, प्लगइन्स, एंड्रॉइड / आईओएस / जेएस सपोर्ट) में आता है और आप सीधे ऐप में एपीआई उत्पन्न करने के लिए एंड्रॉइड स्टूडियो प्लगइन का उपयोग कर सकते हैं ।

यहाँ Github पर सभी कोड पाए जा सकते हैं


3
कृपया अपनी साइट के विज्ञापन के बजाय पहले लिंक को वास्तविक लक्ष्य से बदलें।
स्काईडान

0

हमने Android के लिए हमारे हल्के async REST क्लाइंट लाइब्रेरी को ओपन-सोर्स किया है, आप इसे उपयोगी पा सकते हैं यदि आपके पास न्यूनतम आवश्यकताएं हैं और अपने आप को मल्टीथ्रेडिंग को संभालना नहीं चाहते हैं - यह बुनियादी संचार के लिए बहुत ठीक है, लेकिन एक पूर्ण विकसित REST क्लाइंट नहीं है पुस्तकालय।

इसे libRESTfulClient कहा जाता है और इसे GitHub पर पाया जा सकता है

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