当我们需要和服务器进行交互的时候,需要对远程服务器发送请求,接下来我会概述一下android中okhttp的用法
public class HttpUtil {//发送Http请求类,每次发送Http请求调用该方法
/*
* 通过okhttp3发送请求(用来请求纯文本比较方便)
* */
/*
* 不发送数据
* */
public static void sendHttpRequest(String address, Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.build();
client.newCall(request).enqueue(callback);
//请求封装成任务,通过newCall()发出请求,构造函数中参数为你发送的请求
//然后执行enqueue()方法,讲服务器处理后的结果返回
}
/*
* 发送数据
* */
public static void sendHttpRequest(String address, RequestBody requestBody, Callback callback){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(address)
.post(requestBody)
.build();
//将要发送的数据用RequestBody对象保存,然后传入到该参数即可
client.newCall(request).enqueue(callback);
}
}
我们在一个类中封装了两种请求方法,第一方法是不向服务器传输数据的,第二种方法是向服务器中传递一些数据的。首先OkHttpClient对象,我们通过该对象发送请求。然后创建Request对象,我们通过该该对象发送我们需要传递的参数,.url()方法中放的是服务器的地址,.post()方法中放的是向服务器传递的数据,最后通过build创建该任务。最后通过enqueue()方法得到服务器返回给我们的结果。
接下来给大家看一下具体的一个实例
RequestBody requestBody = new FormBody.Builder()
.add("user_id", uid)
.add("user_password",upassword)
.build();
HttpUtil.sendHttpRequest(ConstantUtil.SERVICE_PATH + "insert_user.php", requestBody, new okhttp3.Callback() {
public void onFailure(Call call, IOException e) {
Log.d("onFailure: ",e+"");
}
public void onResponse(Call call, Response response) throws IOException {
String res = response.body().string();
String result = res;
Log.d("RegisterActivity:", result);
//将返回的值log出来
Message msg = new Message();
msg.obj = result;
handler.sendMessage(msg);
//通过异步处理,把服务器返回的数据丢到handler中,交给主线程更新UI或者处理逻辑
}
});
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
String result=(String)msg.obj;
if(String.valueOf(1).equals(result)){
Toast.makeText(RegisterActivity.this, "注册成功", Toast.LENGTH_SHORT).show();
new AlertDialog.Builder(RegisterActivity.this).setTitle("注册结果").setMessage("注册成功~~~")
.setPositiveButton("好的",null).show();
}else if(String.valueOf(0).equals(result)){
new AlertDialog.Builder(RegisterActivity.this).setTitle("").setMessage("注册失败了")
.setPositiveButton("重新注册",null).show();
}
}
};
其中ConstantUtil.SERVICE_PATH 为我封装后的服务器IP, “insert_user.php”为处理该请求的php文件名。
需要注意的事项
- 首先需要打开服务器的80端口,否则请求是不会发送成功的。
- CallBack接口中实现的两种方法是不可以更新UI,因为是子线程,如果想得知处理结果,可以用logd打印出来,或者通过异步处理。