@linux1s1s
2016-11-18T03:06:13.000000Z
字数 11988
阅读 2091
AndroidRefine 2016-11
系列博文
Android 开源库 - OkHttp
Android 开源库 - Retrofit
Android 开源库 - Okio
Android 开源库 - Fresco
这里仅仅涉及如何使用OkHttp,并做了简单的工具封装,测试用例适用于okhttp:3.4.2
dependencies {compile fileTree(dir: 'libs', include: ['*.jar'])androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {exclude group: 'com.android.support', module: 'support-annotations'})compile 'com.android.support:appcompat-v7:24.2.1'// OkHttpcompile 'com.squareup.okhttp3:okhttp:3.4.2'// OkIocompile 'com.squareup.okio:okio:1.11.0'testCompile 'junit:junit:4.12'}
<?xml version="1.0" encoding="utf-8"?><ScrollView xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="okhttp.mutex.com.okhttpdemo.MainActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"><Buttonandroid:id="@+id/send_get"android:layout_width="200dp"android:layout_height="70dp"android:layout_centerHorizontal="true"android:onClick="sendGet"android:text="Get" /><Buttonandroid:id="@+id/send_get_header"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_get"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendGetWithHeader"android:text="Get Header" /><Buttonandroid:id="@+id/send_get_async"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_get_header"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendGetAsync"android:text="Get Async" /><Buttonandroid:id="@+id/send_get_header_async"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_get_async"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendGetWithHeaderAsync"android:text="Get Async Header" /><Buttonandroid:id="@+id/send_post"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_get_header_async"android:layout_centerHorizontal="true"android:onClick="sendPost"android:text="Post" /><Buttonandroid:id="@+id/send_post_header"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_post"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendPostWithHeader"android:text="Post Header" /><Buttonandroid:id="@+id/send_post_async"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_post_header"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendPostAsync"android:text="post Async" /><Buttonandroid:id="@+id/send_post_header_async"android:layout_width="200dp"android:layout_height="70dp"android:layout_below="@id/send_post_async"android:layout_centerHorizontal="true"android:layout_marginTop="10dp"android:onClick="sendPostWithHeaderAsync"android:text="Post Async Header" /></RelativeLayout></ScrollView>
这里将基本的OKHttp如何使用简单粗暴的封装为一个工具类,包含了get/post 分别带Header以及同步和异步请求8个简单的请求方法。
import android.text.TextUtils;import java.io.IOException;import java.util.Map;import okhttp3.Callback;import okhttp3.FormBody;import okhttp3.MediaType;import okhttp3.OkHttpClient;import okhttp3.Request;import okhttp3.RequestBody;import okhttp3.Response;public class OkHttpUtil {private static final MediaType JSON_TYPE = MediaType.parse("application/json; charset=utf-8");private OkHttpUtil() {//Do nothing}private static OkHttpClient sOkHttpClient = new OkHttpClient();//********************Http Get Sync*************************//public static String okHttpGetSync(String url) {if (TextUtils.isEmpty(url))return null;Request request = new Request.Builder().url(url).build();try {Response response = sOkHttpClient.newCall(request).execute();if (response.isSuccessful()) {return response.body().string();}} catch (IOException e) {e.printStackTrace();}return null;}//********************Http Get Async*************************//public static void okHttpGetAsync(String url, Callback callback) {if (TextUtils.isEmpty(url))return;Request request = new Request.Builder().url(url).build();sOkHttpClient.newCall(request).enqueue(callback);}//********************Http Get Sync With Headers*************************//public static String okHttpGetSync(String url, Map<String, String> headers) {if (TextUtils.isEmpty(url))return null;Request.Builder build = new Request.Builder().url(url);Request request = fillBuild(build, headers).build();try {Response response = sOkHttpClient.newCall(request).execute();if (response.isSuccessful()) {return response.body().string();}} catch (IOException e) {e.printStackTrace();}return null;}//********************Http Get Async With Headers*************************//public static void okHttpGetAsync(String url, Map<String, String> headers, Callback callback) {if (TextUtils.isEmpty(url))return;Request.Builder build = new Request.Builder().url(url);Request request = fillBuild(build, headers).build();sOkHttpClient.newCall(request).enqueue(callback);}//********************Http Post Sync*************************//public static String okHttpPostSyncWithForm(String url, Map<String, String> form) {return okHttpPostSyncWithHeaderForm(url, null, form);}//********************Http Post Sync With Header Form*************************//public static String okHttpPostSyncWithHeaderForm(String url, Map<String, String> headers, Map<String, String> form) {if (TextUtils.isEmpty(url))return null;FormBody body = null;if (form != null && !form.isEmpty()) {FormBody.Builder builder = new FormBody.Builder();for (Map.Entry<String, String> entry : form.entrySet()) {if (entry == null) continue;builder.add(entry.getKey(), entry.getValue());}body = builder.build();}Request.Builder requestBuilder = new Request.Builder().url(url);Request request;if (body != null) {request = fillBuild(requestBuilder, headers).post(body).build();} else {request = fillBuild(requestBuilder, headers).build();}try {Response response = sOkHttpClient.newCall(request).execute();if (response.isSuccessful()) {return response.body().string();}} catch (IOException e) {e.printStackTrace();}return null;}//********************Http Post Async With Form*************************//public static void okHttpPostAsyncWithForm(String url, Map<String, String> form, Callback callback) {okHttpPostAsyncWithHeaderForm(url, null, form, callback);}//********************Http Post Async With Headers Form*************************//public static void okHttpPostAsyncWithHeaderForm(String url, Map<String, String> headers, Map<String, String> form, Callback callback) {if (TextUtils.isEmpty(url))return;FormBody body = null;if (form != null && !form.isEmpty()) {FormBody.Builder builder = new FormBody.Builder();for (Map.Entry<String, String> entry : form.entrySet()) {if (entry == null) continue;builder.add(entry.getKey(), entry.getValue());}body = builder.build();}Request.Builder requestBuilder = new Request.Builder().url(url);Request request;if (body != null) {request = fillBuild(requestBuilder, headers).post(body).build();} else {request = fillBuild(requestBuilder, headers).build();}sOkHttpClient.newCall(request).enqueue(callback);}//********************Http Post Sync With Json*************************//public static String okHttpPostSyncWithJson(String url, String json) {return okHttpPostSyncWithHeaderJson(url, null, json);}private static String okHttpPostSyncWithHeaderJson(String url, Map<String, String> headers, String json) {if (TextUtils.isEmpty(url))return null;RequestBody body = RequestBody.create(JSON_TYPE, json);Request.Builder builder = new Request.Builder().url(url);Request request = fillBuild(builder, headers).post(body).build();try {Response res = sOkHttpClient.newCall(request).execute();if (res.isSuccessful()) {return res.body().string();}} catch (IOException e) {e.printStackTrace();}return null;}//********************Http Post Async With Json*************************//public static void okHttpPostAsyncWithJson(String url, String json, Callback callback) {okHttpPostAsyncWithHeaderJson(url, null, json, callback);}private static void okHttpPostAsyncWithHeaderJson(String url, Map<String, String> headers, String json, Callback callback) {if (TextUtils.isEmpty(url))return;RequestBody body = RequestBody.create(JSON_TYPE, json);Request.Builder builder = new Request.Builder().url(url);Request request = fillBuild(builder, headers).post(body).build();sOkHttpClient.newCall(request).enqueue(callback);}/*** 填充header** @param input* @param headers* @return*/private static Request.Builder fillBuild(Request.Builder input, Map<String, String> headers) {if (headers == null)return input;for (Map.Entry<String, String> entry : headers.entrySet()) {String key = entry.getKey();String value = entry.getValue();input.header(key, value);}return input;}}
主界面TestCase
public class MainActivity extends AppCompatActivity {private static final String URL = "test api";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}/*** get方式请求API,同步** @param view*/public void sendGet(final View view) {new Thread() {@Overridepublic void run() {final String result = OkHttpUtil.okHttpGetSync(URL);runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();}});}}.start();}/*** get方式请求API,异步** @param view*/public void sendGetAsync(final View view) {final Callback callback = obtainCommonCallback();new Thread() {@Overridepublic void run() {OkHttpUtil.okHttpGetAsync(URL, callback);}}.start();}/*** get方式请求API,同步,添加Header** @param view*/public void sendGetWithHeader(final View view) {new Thread() {@Overridepublic void run() {final String result = OkHttpUtil.okHttpGetSync(URL, obtainCommonHeader());runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();}});}}.start();}/*** get方式请求API,异步,添加Header** @param view*/public void sendGetWithHeaderAsync(final View view) {final Callback callback = obtainCommonCallback();new Thread() {@Overridepublic void run() {OkHttpUtil.okHttpGetAsync(URL, obtainCommonHeader(), callback);}}.start();}public void sendPost(final View view) {new Thread() {@Overridepublic void run() {final String result = OkHttpUtil.okHttpPostSyncWithForm(URL, obtainCommonForm());runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();}});}}.start();}public void sendPostWithHeader(final View view) {new Thread() {@Overridepublic void run() {final String result = OkHttpUtil.okHttpPostSyncWithHeaderForm(URL, obtainCommonHeader(), obtainCommonForm());runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();}});}}.start();}public void sendPostAsync(final View view) {new Thread() {@Overridepublic void run() {OkHttpUtil.okHttpPostAsyncWithForm(URL, obtainCommonForm(), obtainCommonCallback());}}.start();}public void sendPostWithHeaderAsync(final View view) {new Thread() {@Overridepublic void run() {OkHttpUtil.okHttpPostAsyncWithHeaderForm(URL, obtainCommonHeader(), obtainCommonForm(), obtainCommonCallback());}}.start();}private Callback obtainCommonCallback() {return new Callback() {@Overridepublic void onFailure(Call call, final IOException e) {runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();}});}@Overridepublic void onResponse(Call call, final Response response) throws IOException {if (response.isSuccessful()) {final String rs = response.body().string();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(MainActivity.this, rs, Toast.LENGTH_SHORT).show();}});}}};}private Map<String, String> obtainCommonHeader() {Map<String, String> headers = new HashMap<>();headers.put("Atest", "Aheader");headers.put("Btest", "Bheader");headers.put("Ctest", "Cheader");headers.put("Dtest", "Dheader");return headers;}private Map<String, String> obtainCommonForm() {Map<String, String> from = new HashMap<>();from.put("AFormKey", "FormValueA");from.put("BFormKey", "FormValueB");from.put("BFormKey", "FormValueC");from.put("BFormKey", "FormValueD");return from;}}
运行以后的主界面

Charles抓包

参考文章:
OkHttp GitHub Doc
Retrofit GitHub DocR Doc
Fresco GitHub Doc
Okio GitHub Video