APP经常会向服务器(后端)发送http请求,但是因为Android自带的http库太难用了,所以大部分的时候都是去使用集成库,OKHttp就还行,记录一下我开发时的过程。
导入
在build.gradle中导入OKHttp
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
测试
在发送请求的时候通常要测试后端给你的接口。如果开发规范的话一般会有接口文档,里面一般包含请求的链接名、属性、类型等。根据文档测试接口(没有文档的话就得跟后端对接一下了)使用Postman测试接口。
Postman:https://www.postman.com/
流程
请求大体分为三种类型:params、body
params
以这个请求为例
//简易的进度条
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("加载中");
new Thread(new Runnable() {
@Override
public void run() {
Log.d("userMessage",userId+" "+passwd);
try {
//在其中加入参数
FormBody.Builder params = new FormBody.Builder();
params.add("id",userId);
params.add("password",passwd);
//创建http客户端
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://192.168.164.94:8080/toLogin")
.post(params.build())
.build();
Response response = client.newCall(request).execute();
//这个方法可以获得响应体中的信息,也就是服务器的响应信息
//需要注意的是response.body()这个方法只能用一次,第二次用的时候就被销毁了,这个请求就会结束。所以必须用一个参数接收,方便后续使用。
String responseBody = response.body().string();
//在后面处理响应
}catch(Exception e){
e.printStackTrace();
progressDialog.dismiss();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"网络请求失败,请检查网
络!",Toast.LENGTH_SHORT).show();
}
});
}
}).start();
}
body
以这个为例
new Thread(new Runnable() {
@Override
public void run() {
try {
//这个很麻烦,因为你要把前端获取的属性拼接成json的string。"的使用要特别注意,很容易出错,写的时候要注意哪些要加\"哪些不要\"
String json = "{\n" +
" \"id\":"+ id +",\n" +
" \"name\":\""+ name +"\",\n" +
" \"subject\":\"" + subject + "\",\n" +
" \"sclass\":\"" + sclass + "\",\n" +
" \"posttime\":\""+ postTime.getTime() + "\",\n" +
" \"creattime\":\""+ creatTime + "\"\n"+
"}";
Log.d("json",json);
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://192.168.164.94:8080/signin")
.post(RequestBody.create(MediaType.parse("application/json"),json))
.build();
Response response = client.newCall(request).execute();
if ( response.body() != null) {
//依然是保存数据
String responseDate = response.body().string();
JSONArray jsonData = new JSONArray(responseDate);
userList = JSON.parseArray(responseDate, User.class);
progressDialog.dismiss();
Toast.makeText(appCompatActivity.getApplicationContext(),"请求成功",Toast.LENGTH_SHORT).show();
}
}else {
progressDialog.dismiss();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"签到失败!请重试",Toast.LENGTH_SHORT).show();
homeText.setText("签到失败!请重试");
}
});
}
}catch (Exception e){
e.printStackTrace();
progressDialog.dismiss();
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(),"网络连接失败!请重试",Toast.LENGTH_SHORT).show();
homeText.setText("签到失败!请重试");
Log.d("签到","签到失败");
}
});
}
}
}).start();