在AndroidManifest.xml配置网络访问权限:
<!-- 访问网络是危险的行为 所以需要权限 --> <uses-permission android:name="android.permission.INTERNET" />
在 app/build.gradle 加入
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
然后点击 sync now 下载okhttp支持包
OKHttpEngine
package liudeli.async.okhttp; import android.util.Log; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * @Author Liudeli * @Describe:网络请求相关的引擎 */ public class OKHttpEngine { private final String TAG = OKHttpEngine.class.getSimpleName(); /** * 单例模式 */ private static OKHttpEngine engine; public static OKHttpEngine getInstance() { if (null == engine) { synchronized (OKHttpEngine.class) { if (null == engine) { engine = new OKHttpEngine(); } } } return engine; } private OKHttpEngine(){} private OkHttpClient client = new OkHttpClient(); /** * Http Get 请求 * [属于同步方法,使用需要加子线程] * @param url * @return * @throws IOException */ public String httpGetResult(String url) throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } /** * Http Post 请求 * [属于同步方法,使用需要加子线程] * @param url * @return * @throws IOException */ public String httpPostResult(String url) throws IOException { Request request = new Request.Builder() .url(url) .build(); Response response = client.newCall(request).execute(); return response.body().string(); } /***************************** 以下属于JSON请求想的代码了 **********************************/ public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); /** * 联调成功方法 postJsonRequest * [属于同步方法,使用需要加子线程,此方法内部已经加入子线程] * @param url * @param stringJSON */ public void postJsonRequest(final String url, final String stringJSON, final MyOKHttpCallback callback) { new Thread() { @Override public void run() { super.run(); try { RequestBody body = RequestBody.create(JSON, stringJSON); Request request = new Request.Builder() .url(url) .post(body) .build(); Response response = client.newCall(request).execute(); String result = response.body().string(); Log.d(TAG, "请求结果信息 result:" + result); callback.result(result); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "postJsonRequest e:" + e.getMessage()); callback.result("error"); } } }.start(); } /** * Post请求,请求的数据是JSON,异步方法,不需要加入子线程 * @param url * @param stringJSON */ public void postJSONRequest(String url, String stringJSON, Callback callback) { try { RequestBody body = RequestBody.create(JSON, stringJSON); Request request = new Request.Builder() .url(url) .post(body) .build(); Call call = client.newCall(request); // 使用client去请求 call.enqueue(callback); // 回调方法,>>> 可以获得请求结果信息 } catch (Exception e) { e.printStackTrace(); } } }
MyOKHttpCallback
package liudeli.async.okhttp; /** * @Author Liudeli * @Describe:ost、Get 普通请求所用到的接口回调接口 */ public abstract class MyOKHttpCallback { /** * 一般是用于,Post、Get 普通请求所用到的接口回调方法 * 异步请求暂时用不到,因为异步用专门的回调方法 * @param result */ public abstract void result(String result); }
MyActivity 使用 okhttp
package liudeli.async.okhttp; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import org.json.JSONObject; import java.io.IOException; import liudeli.async.R; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Response; public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); } /** * 中国天气网地址:http://www.weather.com.cn */ private final String PATH1 = "http://www.weather.com.cn/data/sk/101110101.html"; private final String PATH2 = "http://www.weather.com.cn/data/sk/101110101.html"; private final String PATH3 = "http://www.weather.com.cn/data/sk/101110101.html"; private final String PATH4 = "http://www.weather.com.cn/data/sk/101110101.html"; /** * 普通Http Get 请求 * @param view */ public void request1(View view) { final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); new Thread(){ @Override public void run() { super.run(); try { String result = okHttpEngine.httpGetResult(PATH1); Log.d("@@@", "普通Http Get 请求 响应结果:" + result); } catch (IOException e) { e.printStackTrace(); } } }.start(); } /** * 普通Http Get 请求 * @param view */ public void request2(View view) { final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); new Thread(){ @Override public void run() { super.run(); try { String result = okHttpEngine.httpPostResult(PATH2); Log.d("@@@", "普通Http Post 请求 响应结果:" + result); } catch (IOException e) { e.printStackTrace(); } } }.start(); } /** * Post请求JSON数据1 * @param view */ public void request3(View view) { final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); /** * 这里的JSON jsonString 到底有何用: * * 例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器 * 请求头信息,是公司内部需要的请求头信息,是服务器规定的 * JSONObject jsonHeader = new JSONObject(); * jsonHeader.put("serviceCode", serviceCode); * jsonHeader.put("channelCode", channelCode); * jsonHeader.put("osType", onType); * jsonHeader.put("appVersion", appVersion); * jsonHeader.put("rocket", rocket); * jsonHeader.put("requestTime", requestTime); * .... * * String jsonString =jsonHeader..toString(); */ /** * 这里的JSON jsonString 到底有何用: * * 例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器 * 参数信息,是公司内部需要的参数信息,是服务器规定的 * JSONObject jsonParam = new JSONObject(); * jsonParam.put("param1", param1); * jsonParam.put("param2", param2); * jsonParam.put("param3", param3); * jsonParam.put("param4", param4); * jsonParam.put("param5", param5); * jsonParam.put("param6", param6); * * String jsonString = jsonParam.toString(); */ try { JSONObject jsonParam = new JSONObject(); /*jsonParam.put("param1", ""); jsonParam.put("param2", ""); jsonParam.put("param3", ""); jsonParam.put("param4", ""); jsonParam.put("param5", ""); jsonParam.put("param6", "");*/ // 注意⚠️:jsonString = null 当RequestBody.create(JSON, stringJSON);时会报错 String jsonString = null /*jsonParam.toString()*/ ; okHttpEngine.postJsonRequest(PATH3, jsonString, new MyOKHttpCallback() { @Override public void result(String result) { Log.d("@@@", "Post请求JSON数据1 响应结果:" + result); } }); }catch (Exception e) { e.printStackTrace(); } } /** * Post请求JSON数据2 - okhttp异步 * @param view */ public void request4(View view) { final OKHttpEngine okHttpEngine = OKHttpEngine.getInstance(); /** * 这里的JSON jsonString 到底有何用: * * 例如:以前我在公司做项目的时候,每次请求时,需要传输请求头信息给>>>服务器 * 请求头信息,是公司内部需要的请求头信息,是服务器规定的 * JSONObject jsonHeader = new JSONObject(); * jsonHeader.put("serviceCode", serviceCode); * jsonHeader.put("channelCode", channelCode); * jsonHeader.put("osType", onType); * jsonHeader.put("appVersion", appVersion); * jsonHeader.put("rocket", rocket); * jsonHeader.put("requestTime", requestTime); * .... * * String jsonString =jsonHeader..toString(); */ /** * 这里的JSON jsonString 到底有何用: * * 例如:以前我在公司做项目的时候,每次请求时,需要传输参数给>>>服务器 * 参数信息,是公司内部需要的参数信息,是服务器规定的 * JSONObject jsonParam = new JSONObject(); * jsonParam.put("param1", param1); * jsonParam.put("param2", param2); * jsonParam.put("param3", param3); * jsonParam.put("param4", param4); * jsonParam.put("param5", param5); * jsonParam.put("param6", param6); * * String jsonString = jsonParam.toString(); */ try { JSONObject jsonParam = new JSONObject(); /*jsonParam.put("param1", ""); jsonParam.put("param2", ""); jsonParam.put("param3", ""); jsonParam.put("param4", ""); jsonParam.put("param5", ""); jsonParam.put("param6", "");*/ // 注意⚠️:jsonString = null 当RequestBody.create(JSON, stringJSON);时会报错 String jsonString = null; /*jsonParam.toString()*/ ; okHttpEngine.postJSONRequest(PATH4, jsonString, new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d("@@@", "call.toString:" + call.toString()); } @Override public void onResponse(Call call, Response response) throws IOException { // 获得网络数据 String result = response.body().string(); Log.d("@@@", "响应成功 call.toString:" + call.toString() + " result:" + result); } }); }catch (Exception e) { e.printStackTrace(); } } }
activity_my.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通Http Get 请求" android:onClick="request1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="普通Http Post 请求" android:onClick="request2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Post请求JSON数据1" android:onClick="request3" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Post请求JSON数据2 - okhttp异步" android:onClick="request4" /> </LinearLayout>
由于只有中国天气网地址:http://www.weather.com.cn ,所以不能对这个天气网服务器传参数(JSON jsonString),所以后面两个按钮就不点击测试了,它们是👌OK的