OKHttp的簡單用法
官網對OKHttp的介紹還是比較詳細,英文好的同學可以直接看官網的內容。使用OKHttp我們就需要OKHttp的jar包,同時由于OKHttp依賴于Okio,我們也需要下載Okio的jar包。這兩個準備工作做好了就可以開始了。
一、發送Get請求
Request是OKHttp訪問的請求,Callback是回調,有兩種調用方式,一種是call.execute,這種方式不會開啟新的線程,要在android中使用這個需要自己開啟一個新線程,然后在線程中調用這個東西,這樣反而麻煩了,所以個人推薦使用 call.enqueue,call.enqueue會開啟一個新的線程,在新線程中調用網絡請求。這樣的話我們就得通過Handler來與 android UI交互了。
okHttpClient = new OkHttpClient();
request = new Request.Builder().url(HTTPURL).build();
Call call = okHttpClient.newCall(request);
// 開啟異步線程訪問網絡
call.enqueue(new Callback() {
@Override
public void onResponse(Response response) throws IOException {
String res = response.body().string();
Message msg = new Message();
msg.what = REFRESHDATA;
msg.obj = res;
mHandler.sendMessage(msg);
}
@Override
public void onFailure(Request arg0, IOException arg1) {
}
});</pre><br />
二、發送POST請求
發送POST請求,一種是提交JSON數據:
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON,
"{\"username\":\"lisi\",\"nickname\":\"李四\"}");
Request request = new Request.Builder().url(HTTPURL).post(body).build();
//后面的調用與GET相同
還有一種是提交鍵值對:
RequestBody formBody = new FormEncodingBuilder()
.add("username", "lisi").add("nickname", "李四").build();
Request request = new Request.Builder().url(HTTPURL).post(formBody)
.build();
總結
其實OKHttp相對于HttpURLConnection已經簡單了許多,但是我還是覺得麻煩,而且官方亦不建議我們創建多個OkHttpClient實例,于是又對它進行了一層簡單的封裝。
import java.io.IOException;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
/**
- OKHttp封裝工具類
- @author wangsong
2015-10-9 */ public class OKHttpUtils {
private final static OkHttpClient M_OK_HTTP_CLIENT = new OkHttpClient(); static { M_OK_HTTP_CLIENT.setConnectTimeout(30, TimeUnit.SECONDS); }
/**
- 不開啟異步線程
- @author wangsong 2015-10-9
- @param request
- @return
- @throws IOException */ public static Response execute(Request request) throws IOException { return M_OK_HTTP_CLIENT.newCall(request).execute(); }
/**
- 開啟異步線程訪問,訪問結果自行處理
- @author wangsong 2015-10-9
- @param request
- @param responseCallback */ public static void enqueue(Request request, Callback responseCallback) { M_OK_HTTP_CLIENT.newCall(request).enqueue(responseCallback); } /**
- 開啟異步線程訪問,不對訪問結果進行處理
- @author wangsong 2015-10-9
- @param request
@param responseCallback */ public static void enqueue(Request request) { M_OK_HTTP_CLIENT.newCall(request).enqueue(new Callback() {
@Override public void onResponse(Response arg0) throws IOException { }
@Override public void onFailure(Request arg0, IOException arg1) { } }); }
/**
- 為HttpGet請求拼接一個參數
- @author wangsong 2015-10-9
- @param url
- @param name
- @param value */ public static String jointURL(String url, String name, String value) { return url + "?" + name + "=" + value; }
/**
- 為HttpGet請求拼接多個參數
- @author wangsong 2015-10-9
- @param url
- @param name
- @param value */ public static String jointURL(String url, Map<String, String> values) { StringBuffer result = new StringBuffer(); result.append(url).append("?"); Set<String> keys = values.keySet(); for (String key : keys) { result.append(key).append("=").append(values.get(key)).append("&"); } return result.toString().substring(0, result.toString().length()-1); }
}</pre>
本文涉及到的工具類下載地址https://github.com/lenve/OKHttpUtils
來自:http://blog.csdn.net/u012702547/article/details/49045765