電子多媒體實驗室android端調取網絡接口標準

1.什麼是網絡接口

應用程序接口(API:application programming interface)是一組定義、程序及協議的集合,通過 API 接口實現計算機軟件之間的相互通信。API 的一個主要功能是提供通用功能集。程序員通過使用 API 函數開發應用程序,從而可以避免編寫無用程序,以減輕編程任務。

2.調取網絡接口的基本流程

Android端應用程序首先按某種格式向某個URL發送請求數據(request),服務端接收到請求數據之後會給服務端返回相應的數據

3.調取網絡接口的方式

常用的方法有兩種,分別是post方法和get方法,他們兩者的區別是:
1.get是從服務器上獲取數據,post是向服務器傳送數據。
2.get方式是直接在請求的url地址後面添加請求信息,而post方式是將請求字段放在HEADER裏,用戶不可見。
3. get傳送的數據量較小,不能大於2KB。post傳送的數據量較大,一般被默認爲不受限制。但理論上,IIS4中最大量爲80KB,IIS5中爲100KB。
4. get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。

建議:
1、get方式的安全性較Post方式要差些,包含機密信息的話,建議用Post數據提交方式;
2、在做數據查詢時,建議用Get方式;而在做數據添加、修改或刪除時,建議用Post方式;

4.Android發起網絡請求的方式

1.java.net包中的HttpURLConnection類
2.第三方框架如OKHttp,Volley,Retrofit等等。

實驗室中,我推薦使用Retrofit作爲網絡請求的標準框架,但是如果你有自己更喜歡的框架,我們並不會做硬性要求。

5.Retrofit的使用

http://square.github.io/retrofit/ Retrofit的說明文檔。

1.爲什麼使用Retrofit

retrofit使用簡單性能優越,並且可以和RxJava進行結合,這些優勢使它成爲了目前最流行的網絡請求類庫。

2.如何使用

首先我們要在項目中導入Retrofit,這裏只討論AndroidStudio的導入方法:
方法一:在gradle中的dependencies中添加compile 'com.squareup.retrofit2:retrofit:2.1.0'。
方法二:在AndroidStudio2.2版本之前,你可以點擊File->Project Structure->app進入如下界面

點擊+號選擇Library Dependency,輸入retrofit進行搜索,選擇最新版本即可,比較推薦使用這種方法進行導包。


首先我們需要一個接口

先講講GET方法:
Retrofit使用Java接口的方式來編輯http api:
public interface GitHubService {
  @GET("users/{user}/repos")
  Call<List<Repo>> listRepos(@Path("user") String user);
}
在Get中寫的是url的後綴如http://write.blog.csdn.net/postedit的postedit,在{}中被@Path的屬性代替。
Call的泛型中是所接收數據的類型。

然後這樣進行接口調用
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();

GitHubService service = retrofit.create(GitHubService.class);

你也可以加入Query參數:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);

如果Query參數過多,則可以使用QueryMap:
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);

POST方法:

普通傳json:
目前實驗室一般以http + json的方式提交請求數據,而如果是單純提交json數據的接口,Retrofit會自動把實體類的數據轉化爲json格式
所以在準備調取接口時先寫一個請求體的實體類,比如一個登錄業務:
public class LoginUser {
    public String loginname;
    public String password;

    public LoginUser(String loginname, String password) {
        this.loginname = loginname;
        this.password = password;
    }
}

那麼在接口中寫的方法就是這樣的:
@POST("NewLifeBeta/TeaLogin")
    Call<UserEntity> login(@Body LoginUser loginUser);
關於提交json數據的詳細方法我在另一篇博客中有詳細說明。

表單提交:
如果要求用表單提交數據那麼:
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

注意:@FormUrlEncoded代表該次請求爲表單提交,方法中的@Field參數代表表單的鍵值對,@Field括號內爲key,外面的參數爲value。

其他提交格式請參考官方文檔,這裏我就不再描述了。

還需要一個保存結果的實體類

比如:
public class UserEntity {
    @SerializedName("resultCode")
    private int resultCode;
    @SerializedName("resultMessage")
    private String resultMessage;
    @SerializedName("data")
    private User user;

    public UserEntity(int resultCode, String resultMessage, User user) {
        this.resultCode = resultCode;
        this.resultMessage = resultMessage;
        this.user = user;
    }

    public int getResultCode() {
        return resultCode;
    }

    public void setResultCode(int resultCode) {
        this.resultCode = resultCode;
    }

    public String getResultMessage() {
        return resultMessage;
    }

    public void setResultMessage(String resultMessage) {
        this.resultMessage = resultMessage;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

注意:如果你想讓返回的json數據直接解析到對應的屬性上,你就要引入retrofit的轉換工廠,這裏推薦gson工廠,在project structure中搜索retrofit找到converter-gson導入即可,然後在屬性上方註釋@SerializedName("data"),括號內爲json的解析字段。

正式開始調用

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("url")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        RetrofitWork retrofitWork = retrofit.create(RetrofitWork.class);
        Call<UserEntity> login = retrofitWork.login(loginUser);
        login.enqueue(this);

@Override
    public void onResponse(Call<UserEntity> call, Response<UserEntity> response) {
        Toast.makeText(MainActivity.this, "success", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onFailure(Call<UserEntity> call, Throwable t) {
        Toast.makeText(MainActivity.this, "fail" + t.toString(), Toast.LENGTH_SHORT).show();
    }
注意:1.addConverterFactory(GsonConverterFactory.create())爲轉換工廠,需要導入對應的包。
  2.baseUrl中填入自己的url,建議不要全填,只要填公用部分就可以,可以複用。
  3.login後有幾種方法,enqueue爲異步執行,execute爲同步,一般都採用異步模式調接口,因爲網絡請求是耗時操作,會阻塞主線程。
  4.請求成功時回調onSuccess方法,失敗調用onFailure方法,onSuccess中response.body()可返回泛型類型的實體對象。



6.常見案例(具有實驗室特色)

1.僞表單提交

特徵:看起來是表單提交(然後後端也是這麼跟你說的),結果根據鍵值對進行提交發現不能收到返回。最後發現後端原來是隻要接受一個json數據之後再將就送數據中的鍵值對提取出來,所以在發起請求的時候只要向後端用表單提交的方式提交一個jsonObject對象即可,並且@Field中的參數可以爲任意值(包括空).

分辨方法:嘗試或者與後端進行交流,看文檔基本看不出個所以然。

應對方法:重要的是接口中方法的寫法,這種情況的寫法應該爲
@FormUrlEncoded
    @POST("/ReturnSoftContent_json.aspx")
    Call<AboutUsEntity> aboutUs(@Field("contenttype") JSONObject jsonObject);

2.真表單提交(method + parament)

這是實驗室之後主流的調接口方式,格式爲:method:value
parament:value

特徵:看一眼就知道啦,一般parament中爲一個json對象。

分辨方法:一目瞭然。

應對方法:
@FormUrlEncoded
    @POST("Users.aspx")
    Call<RemoteDataResult<UserEntity>> login(@Field("method") String method
            , @Field("parament") JSONObject jsonObject);

3.單純的json提交

特徵:就是提交一個json

應對方法:
@POST("NewLifeBeta/TeaLogin")
    Call<UserEntity> login(@Body LoginUser loginUser);
這種方法我在上文中有詳細描述。


7.總結

由於後端的寫法即將統一,所以經過指示,也將android的調取接口方法進行統一,寫這篇文章一來告訴大家Retrofit的使用方法以及規範寫法,二來也給從未接觸網絡接口的同學們提供方便,不過凡事自己探索出來纔是對自己最有益處的,別人給你鋪好了路但是自己沒有研究過的話,一旦出了問題根本無從下手,只能四處尋找幫助,所以我建議大家只將這篇文章作爲一個參考,因爲很多地方我也只是點到爲止,許多東西還要留給大家自己摸索(其實我自己對Retrofit也不是全懂,好多東西自己也沒有用過),哦對了,老鳥們就不要理我了,如果文章有誤,請指出,最後給大家一個扣丁學堂的Retrofit視頻作爲參考:點擊打開鏈接




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章