如何使用Retrofit寫一個Android的REST客戶端的小教程
Retrofit指南
- 原文鏈接 : Retrofit Android Tutorial
- 譯文出自 : 開發技術前線 www.devtf.cn
- 譯者 : yaoqinwei
- 校對者: chaosssss
- 狀態 : 完成
</ul> </blockquote>這是一篇關于如何使用Retrofit寫一個Android的REST客戶端的小教程。
我為什么選擇Retrofit?
在使用square的Retrofit之前,我嘗試過Volley和AsyncTask。但在使用過Retrofit之后,我的工作變得更加簡單了。在開始閱讀教程之前,建議先閱讀一下下面的幾個話題。這是一個入門項目,可以讓你了解如何使用Retrofit從API獲取數據。
這個項目也加到了我的Github中。
與Retrofit相比,Volley是一個小型庫,但它是非法的。Retrofit是Square開發的,后者還開發過okhttp,picasso...等一些著名的庫(你可以在這里找到其他的庫)。如果你需要Volley的指引,你可以在Google Training或者Volley Plus from DWork找到相關文檔。
簡介
Retrofit是Square開 發的一個Android和Java的REST客戶端庫。這個庫非常簡單并且具有很多特性,相比其他的網絡庫,更容易讓初學者快速掌握。它可以處理GET、 POST、PUT、DELETE...等請求,還可以使用picasso加載圖片。在使用Picasso或Volley之前,可以先來讀讀這個。
別糾結簡介了,開始編碼吧!!!
Demo里使用是Github的API : https://api.github.com/users/basil2style
你可以使用這個Demo App來搜索github的用戶詳細信息
1) 概述
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 :
3) 創建項目
1) 在Android Studio中創建新項目: File => New Project ,填寫描述信息并點擊Next.
2) 填寫minimum SDK,我用的是4.0+(Retrofit支持Android 2.3+或Java 6以上)
3) 選擇Blank Activity然后填寫Activity Name和Layout Name,最后點擊 Finish.
4) Gradle : 你可以在app =>build.gradle中添加Retrofit的庫文件。
Jar包的添加方式 : 將jar包添加到libs文件夾下,右鍵點擊Add as Library.
5) 創建兩個包:API和model。
6) 在API包下右鍵點擊New => Java Class , 填寫Name為gitapi并設置為Interface。
6) 在API包下創建名gitapi的接口。
7) 在model包下右鍵點擊New => Java Class, 填寫Name為gitmodel并設置為Class。
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,如果你不了解JSON Array和JSON 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