如何使用Retrofit寫一個Android的REST客戶端的小教程

jopen 10年前發布 | 229K 次閱讀 Android Android開發 移動開發

Retrofit指南


  • 原文鏈接 : Retrofit Android Tutorial
  • 譯文出自 : 開發技術前線 www.devtf.cn
  • 譯者 : yaoqinwei
  • 校對者: chaosssss
  • 狀態 : 完成
  • </ul> </blockquote>

    這是一篇關于如何使用Retrofit寫一個Android的REST客戶端的小教程。

    Retrofit+Android

    我為什么選擇Retrofit?

    在使用square的Retrofit之前,我嘗試過Volley和AsyncTask。但在使用過Retrofit之后,我的工作變得更加簡單了。在開始閱讀教程之前,建議先閱讀一下下面的幾個話題。這是一個入門項目,可以讓你了解如何使用Retrofit從API獲取數據。

    這個項目也加到了我的Github中。

    AsyncHttp ,Volley和Retrofit的對比

    volley-vs-retrofit

    與Retrofit相比,Volley是一個小型庫,但它是非法的。Retrofit是Square開發的,后者還開發過okhttp,picasso...等一些著名的庫(你可以在這里找到其他的庫)。如果你需要Volley的指引,你可以在Google Training或者Volley Plus from DWork找到相關文檔。

    簡介

    RetrofitSquare開 發的一個Android和Java的REST客戶端庫。這個庫非常簡單并且具有很多特性,相比其他的網絡庫,更容易讓初學者快速掌握。它可以處理GET、 POST、PUT、DELETE...等請求,還可以使用picasso加載圖片。在使用Picasso或Volley之前,可以先來讀讀這個

    別糾結簡介了,開始編碼吧!!!

    Demo里使用是Github的API : https://api.github.com/users/basil2style

    你可以使用這個Demo App來搜索github的用戶詳細信息

    GITHUB

    Download-Code

    Download APK

    qr code

    1) 概述

    Retrofit-3-classes

    1) POJO或模型實體類 : 從服務器獲取的JSON數據將被填充到這種類的實例中。

    2) 接口 : 我們需要創建一個接口來管理像GET,POST...等請求的URL,這是一個服務類。

    3) RestAdapter類 : 這是一個REST客戶端(RestClient)類,retrofit中默認用的是Gson來解析JSON數據,你也可以設置自己的JSON解析器,比如jackson,我們將在下面的教程中詳細解說明。

    2) 添加Retrofit庫到項目中

    Gradle :

    compile 'com.squareup.retrofit:retrofit:1.9.0'

    目前,1.9.0是最新的版本. 你可以在這里獲取更新的版本。

    JAR :

    下載Jar包

    3) 創建項目

    1) 在Android Studio中創建新項目: File => New Project ,填寫描述信息并點擊Next.

    2) 填寫minimum SDK,我用的是4.0+(Retrofit支持Android 2.3+或Java 6以上)

    3) 選擇Blank Activity然后填寫Activity NameLayout Name,最后點擊 Finish.

    4) Gradle : 你可以在app =>build.gradle中添加Retrofit的庫文件。

    gradle-dependencies

    Jar包的添加方式 : 將jar包添加到libs文件夾下,右鍵點擊Add as Library.

    5) 創建兩個包:APImodel

    6) 在API包下右鍵點擊New => Java Class , 填寫Name為gitapi并設置為Interface。

    6) 在API包下創建名gitapi的接口。

    7) 在model包下右鍵點擊New => Java Class, 填寫Name為gitmodel并設置為Class。

    proj-structure

    4) Android Manifest

    1) 添加INTERNET PERMISSION權限

    <uses-permission android:name="android.permission.INTERNET"/>

    你的Manifest文件看起來應該是這樣的 :

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
              package="com.makeinfo.flowerpi" >
       <uses-permission android:name="android.permission.INTERNET"/>
       <application android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:theme="@style/AppTheme" >
           <activity
               android:name=".MainActivity"
               android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                     <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
     </manifest>

    5) 模型類

    首先,我們需要創建一個POJO或模型類。服務器返回的JSON數據不能在Java里直接使用,所以我們需要用模型類來做轉換。

    URL的結構是這樣的:https://api.github.com/users/ + “search term”

    舉個栗子:https://api.github.com/users/basil2style

    我們的JSON返回數據是這樣的:

    json object response

    這是一個JSON Object,如果你不了解JSON ArrayJSON Object的區別,請看這里

    使用jsonschema2pojo來創建POJO更加簡單,不要每一個JSON數據的POJO轉換都用它,有時候會報錯。選擇源代碼類型為Json,注解類型是Gson,然后點擊preview

    點擊這里(國內或許不能訪問)查看gitmodel.java源代碼。

    6) gitapi.java

    1) 現在我們需要使用接口調用URL.

    @GET("/users/{user}"), 添加這個注解會調用服務器,參數url基于BASE URL,服務調用的參數以'/'開頭,其中{user}是從EditText獲取的字符串。

    @Path("user") String user 就是我們從EditText獲取的字符串。

    服務器端響應的數據則會被存儲到POJO實例中去。

    public interface gitapi {
    
        @GET("/users/{user}")      // here is the other url part.best way is to start using /
        public void getFeed(@Path("user") String user, Callback<gitmodel> response);
         // string user is for passing values from edittext for eg: user=basil2style,google
         // response is the response from the server which is now in the POJO
    }

    7) RestAdapter

    現在該主要部分了,你需要設置Rest Adapter和service類.

    1) API就是Base URL.

    2) 我們需要設置Endpoint(API)并調用buid()方法來創建一個RestAdapter對象。

    3) 使用我們的gitapi來創建一個服務適配器(service for adapter)。

    4) 調用函數并獲得響應數據,回調接口是用來異步的獲取模型實例的,我們的回調接口需要實現成功回調方法(success request)和錯誤處理方法(error handling)。

    5) Our parsed json will be now in POJO. You can call each by calling each item.

    5) 我們解析好的json數據的現在就存在于POJO實例中了,你可以每次調用一條。

    String API = "https://api.github.com";
    
    RestAdapter restAdapter = new RestAdapter.Builder().setLogLevel(RestAdapter.LogLevel.FULL).setEndpoint(API).build(); 
    
    gitapi git = restAdapter.create(gitapi.class);
    
    git.getFeed(user, new Callback<gitmodel>() {
        @Override
        public void success(gitmodel gitmodel, Response response) {
            tv.setText("Github Name :" + gitmodel.getName() + 
                       "\nWebsite :" + gitmodel.getBlog() + 
                       "\nCompany Name :" + gitmodel.getCompany());
    
            pbar.setVisibility(View.INVISIBLE); // disable progressbar
        }
    
        @Override
        public void failure(RetrofitError error) {
            tv.setText(error.getMessage());
            pbar.setVisibility(View.INVISIBLE); //disable progressbar
        }
     });

    完整的MainActivty.java代碼:

    package com.makeinfo.flowerpi;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ProgressBar;
    import android.widget.TextView;
    
    import com.makeinfo.flowerpi.API.gitapi;
    import com.makeinfo.flowerpi.model.gitmodel;
    
    import retrofit.Callback;
    import retrofit.RestAdapter;
    import retrofit.RetrofitError;
    import retrofit.client.Response;
    
    
    public class MainActivity extends ActionBarActivity {
    
        Button click;
        TextView tv;
        EditText edit_user;
        ProgressBar pbar;
        String API = "https://api.github.com";  // BASE URL
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            click = (Button) findViewById(R.id.button);
            tv = (TextView) findViewById(R.id.tv);
            edit_user = (EditText) findViewById(R.id.edit);
            pbar = (ProgressBar) findViewById(R.id.pb);
            pbar.setVisibility(View.INVISIBLE);
    
            click.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String user = edit_user.getText().toString();
                    pbar.setVisibility(View.VISIBLE);
    
                    // Retrofit section start from here...
                    // create an adapter for retrofit with base url
                    RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint(API).build(); 
    
                    // creating a service for adapter with our GET class       
                    gitapi git = restAdapter.create(gitapi.class);  
    
                    // Now ,we need to call for response
                    // Retrofit using gson for JSON-POJO conversion
    
                    git.getFeed(user,new Callback<gitmodel>() {
                        @Override
                        public void success(gitmodel gitmodel, Response response) {
                            // we get json object from github server to our POJO or model class
    
                            tv.setText("Github Name :" + gitmodel.getName() + 
                                        "\nWebsite :"+gitmodel.getBlog() + 
                                        "\nCompany Name :"+gitmodel.getCompany());
    
                            pbar.setVisibility(View.INVISIBLE); // disable progressbar
                        }
    
                        @Override
                        public void failure(RetrofitError error) {
                            tv.setText(error.getMessage());
                            pbar.setVisibility(View.INVISIBLE); // disable progressbar
                        }
                    });
                }
            });
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
    
            //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
                return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    }
    來自:https://github.com/bboyfeiyu/android-tech-frontier/tree/master/issue-7/Retrofit%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!