以前做Android开发一直用的httpclient,最近参加了工作,发现真正的项目里面用的是okhttp,就想要针对它来写一篇文章记录一下,也是希望自己能够弄懂它,尽快摆脱菜鸟的身份。话不多说,进入主题。[参照原文]https://www.cnblogs.com/alterem/p/11403695.html
okhttp其实就是一套网络请求的框架,它的作用和httpclient一样,只是好像在Android6.0以后谷歌就删除了httpclient,所以现在大家还是写着用okhttp吧,毕竟程序员还是要跟上技术的迭代和更新,这是非常重要的。
在使用okhttp的时候,需要现在项目中添加okhttp的依赖,具体的添加方法是将项目目录切换到Project,找到app目录下的build.gradle,在dependencies中添加implementation 'com.squareup.okhttp3:okhttp:3.10.0',如图: QQ截图20210518141337.png一、OKhttp进行GET请求(四步完成)
1、拿到OkHttpClient对象
OkHttpClient client = new OkHttpClient()
2 . 构造Request对象
Request request = new Request.Builder()
.get()
.url("https:www.baidu.com")
.build();
如果GET请求需要加请求参数直接用?拼接在url里面,不同参数之间用&拼接,例如:
https:www.baidu.com?username=admin&password=admin
3、将Request封装为Call
Call call = client.newCall(request);
4 . 根据需要调用同步或者异步请求方法
//同步调用,返回Response,会抛出IO异常
Response response = call.execute();
//异步调用,并设置回调函数
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(OkHttpActivity.this, "get failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
contentTv.setText(res);
}
});
}
});
同步调用会阻塞主线程,一般不用
异步调用的runOnUiThread()类似于Handler,用来更新ui,另外一定要记住,所有的网络请求都不能在主线程中,所以okhttp的所有操作都要在子线程中执行。
二、使用okhttp进行post请求并提交键值对参数(五步)
1、拿到OKhttpclient对象
okhttpclient client=new OKhttpclient();
2、构建FormBody传入参数
FormBody formBody = new FormBody.Builder()
.add("username", "admin")
.add("password", "admin")
.build();
3 . 构建Request,将FormBody作为Post方法的参数传入
.url("http://www.jianshu.com/")
.post(formBody)
.build();
4 . 将Request封装为Call
Call call = client.newCall(request);
5 . 调用请求,重写回调方法
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Toast.makeText(OkHttpActivity.this, "Post Failed", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String res = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
contentTv.setText(res);
}
});
}
});
网友评论