撰寫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 格式解析為例。
文章標籤
全站熱搜