前言:
OkHttp在Android上为我们提供了第三方框架里网络请求的最佳使用方式。下面简略看其使用方法。
依赖:implementation 'com.squareup.okhttp3:okhttp:3.10.0'
注意事项:
- 使用前要先在AndroidManifest.xml注册网络请求权限
- 所有OkHttp请求实例均需要在子线程内进行,这意味着需要我们手动开启一个线程
- 所有OkHttp请求实例的IO输出均有异常风险,这意味着我们必须使用
try catch
来捕捉异常(请求实例放入try
内) response.body().string()
只可被使用一次(不可多次使用,否则异常)- 如果想要在请求数据获得后进行更新UI,最简便的方法是调用
runOnUiThread()
回到主线程(使用Hnadler
也可以)
Get请求:
说明:
首先我们先构建出一个OkHttpClient()
对象实例;然后通过链式调用创建一个Request
对象,URL为http://www.fynu.edu.cn/,后接两个参数,其键与值分别为"account"、“password”,“admin”、“467”;之后调用OkHttpClient()
对象实例的newCall()
方法创建Call()
方法,并调用其execute()
来返回其从服务器获得的数据。
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.fynu.edu.cn/?account=amdmin&password=467")
.build();
Response response = client.newCall(request).execute();
String data = response.body().string();
Post请求:
说明:
Post请求与Get请求多了表单这个概念,其实就是特殊的键值对。需要说明的是,这个表单内的数据近似无限多(字符占用很少,但有的浏览器限制为几兆比以内)。下面的add()
方法内第一个就是键,第二个就是值,其余均类似,不再赘述。
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("id","2012001")
.add("paswword","123456789")
.build();
Request request = new Request.Builder()
.url("https://www.test.com/NoneTest_war_exploded/test")
.post(requestBody)
.build();
Response response = client.newCall(request).execute();
String data = response.body().string();
回调方法:
Post与Get均有两个回调方法,一个是请求成功的方法onResponse()
,另一个是请求失败的方法onFailure()
。下面以Post请求为例:
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("id","2012001")
.build();
Request request = new Request.Builder()
.url("http://192.168.137.1:8080/NoneTest_war_exploded/test")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String data = response.body().string();
}
});
完整示例:
private void requestTest(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("id","2012001")
.build();
Request request = new Request.Builder()
.url("http://192.168.137.1:8080/NoneTest_war_exploded/test")
.post(requestBody)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String data = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
// According to data of reponse to update UI thread.
textView.setText(data);
}
});
}
});
} catch (Exception e){
e.printStackTrace();
}
}
}).start();
}