撰寫HTTP Post 必須使用到網路功能,因此仍需要至 androidmanifest.xml 添加權限:

 

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

 

此次使用 okhttp,因此需要先安裝相關套件,於 build.gradle 內添加

1
2
3
4
dependencies {

    compile 'com.squareup.okhttp:okhttp:2.4.0'
}

 

由於通常Web API 在設計時會有固定的操作模式,因此將基本的設定製作成一個 abstract class ,再針對不同的服務項目製作對應的Task:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public abstract class WebAPITask extends AsyncTask<Void, Void, Void> {
    final OkHttpClient client = new OkHttpClient();
    protected String mResponseString = new String();
    protected boolean IsFinish = false;
    protected WebAPITask(){
        HttpClientInit();
    }
    protected void HttpClientInit(){
        client.setConnectTimeout(30, TimeUnit.SECONDS);
        client.setReadTimeout(30, TimeUnit.SECONDS);
    }

}

其中 OKHttpClient 為本次要使用的HTTP Post class,mResponseString 為儲存HTTP GET/POST 的 Response 字串。

 

以下以常見的登入功能為例進行Web API之實作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
public class TaskLogin extends WebAPITask{

    private String mAccount;
    private String mPassword;

    private boolean mIsLogin = false;
    private String LoginToken = "";
    public TaskLogin(String account,String password){
        super();

        mAccount = account;
        mPassword = password;
    }

    @Override
    protected Void doInBackground(Void... voids) {

        final RequestBody formBody = new FormEncodingBuilder()
                .add("user", mAccount)
                .add("pass", mPassword)
                .build();

        final Request request = new Request.Builder()
                .url("https:\\sample.com")
                .post(formBody)
                .build();

        Response response = null;
        try {
            response = client.newCall(request).execute();

            //mResponseString = "{\"status\":\"200\",\"token\":\"3e3e4bc1e8a723bc1d306a51f5e1f1b7\"}";
            mResponseString = response.body().string().toString();

            validLogin();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    private void validLogin(){
        try {
            JSONObject jobj=new JSONObject(mResponseString);
            int statuscode = jobj.getInt("status");
            if(statuscode == 200){
                // login scuessful
                mIsLogin = true;
                LoginToken = jobj.getString("token");
            }else {
                mIsLogin = false;
            }
            IsFinish = true;
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    public String getLoginToken() {
        return LoginToken;
    }

    public boolean IsLogin() {
        return mIsLogin;
    }
};

 

其中較為關鍵之程式碼為 line 16 ~ line 40;

line 18 ~ line 26 製作Request 封包(line 24的 url 為目標網址 );

line 33 取得 HTTP Response;

最後由 validLogin function 負責進行 Response 封包解析,因為Web API 常用json 格式,以json 格式解析為例。

 

arrow
arrow
    文章標籤
    java Android
    全站熱搜

    Lung-Yu,Tsai 發表在 痞客邦 留言(0) 人氣()