OkHttp-支持SPDY协议的高效HTTP库
okhttp官网 点此进入
1.了解Okhttp
HttpURLConnection和HttpClient ,虽然两者都支持HTTPS ,流的上传和下载,配置超时, IPV6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP可以让我们的应用运行更快、更节省流量。而OkHttp库就是为此而生。
OkHttp是一个高效的HTTP库:
-
支持SPDY,共享同一个Socket来处理同一个服务器的所有请求
-
如果SPDY不可用,则通过连接池来减少请求延时
-
无缝的支持GZIP来减少数据流量
-
缓存响应数据来减少重复的网络请求
-
会从很多常用的连接问题中自动恢复。如果服务器配置了多个IP地址,当第一个IP连接失败的时候, OkHttp会自动尝试下一个IP。
-
OkHttp还处理 了代理服务器问题和SSL握手失败问题。
-
使用OkHttp无需重写程序中的网络代码。OkHttp实现了几乎和HttpURLConnection-样的API。如果用了HttpClient ,则OkHttp也提供了一个对应的okhttp-apache模块。
OkHttp是一个相对成熟的解决方案 ,并且Android4.4的源码中可以看到HttpURLConnection已经替换成OkHttp实现了。
所以我们更有理由相信OkHttp的强大。
2.程序
此程序是通过get方式与post方式访问一个接口来获取接口的信息。
接口地址 http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号
1.在build.gradle文件中加入依赖
implementation 'com.squareup.okhttp3:okhttp:4.4.0'
2.AndroidManifest.xml添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3.在AndroidMainfest.xml的application标签内添加
android:usesCleartextTraffic="true"
4.MainActivity.java代码,xml就不放了,两个button
public class MainActivity extends AppCompatActivity {
private Button btn1;
private Button btn2;
private String urlAddressFront = "http://tcc.taobao.com";
private String urlAddressMethod = "/cc/json/mobile_tel_segment.htm";
private OkHttpClient okHttpClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn_get);
btn2 = (Button) findViewById(R.id.btn_post);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doGet("19999999999");
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
doPost("18888888888");
}
});
okHttpClient = new OkHttpClient(); //okHttpClient的初始化
}
//doPost,通过构造请求参数
private void doPost(final String s) {
new Thread(new Runnable() {
@Override
public void run() {
FormBody formBody = new FormBody.Builder().add("tel",s).build(); //参数是键值对,如("username","张三")
Request request = new Request.Builder().url(urlAddressFront + urlAddressMethod).post(formBody).build(); //完整请求
//准备发送请求 这里使用异步请求
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d("TAGPOST","failed");
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.d("TAGPOST",response.body().string());
}
});
}
}).start();
}
//doGet,通过拼接url
private void doGet(String s) {
final String urlAddress = urlAddressFront + urlAddressMethod + "?tel=" + s; //拼接出完整的url
new Thread(new Runnable() {
@Override
public void run() {
//先生成一个Request请求
Request request = new Request.Builder().url(urlAddress).build();
//准备发送请求 okhttp请求有两种:同步请求和异步请求,这里使用同步请求
try {
Response response = okHttpClient.newCall(request).execute(); //发送请求并返回response,存到response中
if(response.isSuccessful()){
Log.d("TAGGET",response.body().string());
}else {
Log.d("TAGGET","failed");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
}
3.更多
关于Okhttp,更详细请见大佬博客