一、简介
HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽。OkHttp是一个高效的HTTP客户端,它有以下默认特性:
1、支持HTTP/2,允许所有同一个主机地址的请求共享同一个socket连接
2、连接池减少请求延时
3、透明的GZIP压缩减少响应数据的大小
4、缓存响应内容,避免一些完全重复的请求
当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。
二、使用
OkHttp的使用是非常简单的. 它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。
Download OkHttp3
在build.gradle
中添加以下依赖
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
不要忘了在清单文件声明访问Internet的权限
这里简单的写一个小demo,主要是利用开放API进行POST登录请求,其它具体的使用方法参考以下文章https://www.jianshu.com/p/da4a806e599b
demo中的API是玩安卓的开放API
https://www.wanandroid.com/blog/show/2
2.1、demo案例
package cn.zzuli.myapp.activity;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.json.JSONObject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import cn.zzuli.myapp.R;
import cn.zzuli.myapp.util.AppConfig;
import cn.zzuli.myapp.util.StringUtils;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class LoginActivity extends BaseActivity {
private EditText etAccount;
private EditText etPwd;
private Button btnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
etAccount = findViewById(R.id.et_account);
etPwd = findViewById(R.id.et_pwd);
btnLogin = findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account = etAccount.getText().toString().trim();
String pwd = etPwd.getText().toString().trim();
login(account,pwd);
}
});
}
private void login(String account,String pwd) {
if(StringUtils.isEmpty(account)){
showToast("请输入账号");
// Toast.makeText(this,"请输入账号",Toast.LENGTH_SHORT).show();
return;
}
if(StringUtils.isEmpty(pwd)){
showToast("请输入密码");
// Toast.makeText(this,"请输入密码",Toast.LENGTH_SHORT).show();
return;
}
//第一步创建OkHttpClient
OkHttpClient client = new OkHttpClient.Builder().build();
//第二步放入数据
RequestBody requestBodyJson = new FormBody.Builder()
.add("username",account)
.add("password",pwd)
.build();
//第三步创建Request
Request request = new Request.Builder()
.url(AppConfig.Base_URL + "/user/login")
.addHeader("contentType","application/json;charset=utf-8")
.post(requestBodyJson)
.build();
//第四步创建call回调对象
final Call call = client.newCall(request);
//第五步发起请求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("onFailure",e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
//放在主线程中进行
runOnUiThread(new Runnable() {
@Override
public void run() {
showToast(result);
}
});
System.out.println(result);
}
});
}
}