一:OkHttp介绍
1:HTTP是现代网络应用的方式。这是我们交换数据和媒体的方式。高效地使用HTTP可以加快加载速度并节省带宽。
OkHttp是默认情况下高效的HTTP客户端:
- HTTP/2支持允许对同一主机的所有请求共享一个套接字
- 连接池减少了请求延迟(如果HTTP/2不可用)
- 透明GZIP缩小了下载大小
- 响应缓存完全避免了重复请求的网络
2:使用OkHttp很简单。它的请求/响应API是用fluent构建器和不变性设计的。它支持同步阻塞调用和带有回调的异步调用,以上内容来自官网翻译
- 官网地址:https://github.com/square/okhttp
- 使用流程:
创建Request.Builder()的Requset对象
通过Request得到Call对象:client.newCall(request)
执行Call:同步使用call.execute(),异步call.enqueue()
得到Response对象
二:分析
1:OkHttp适用于android5.0+(API级别21+)和java8+。OkHttp由Square公司贡献的一个处理网络请求的开源项目,是Android使用最广泛网络框架。
2:http请求过程是怎末样的?
- 域名解析(DNS)
- 解析到ip去建立TCP连接(三次握手)
- 建立TCP连接后发起http
- 利用Socket输出流写出Http报文
3:过程
三:效果
四:使用
1:布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="okhttp get 请求" />
<Button
android:id="@+id/btn_post"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="okhttp post 请求" />
<Button
android:id="@+id/btn_post_multipart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="okhttp post multipart 请求" />
<Button
android:id="@+id/btn_post_json"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="okhttp post json 请求" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
2:MainActivity.java代码
package com.hanjie.okhttpretrofit;
import androidx.appcompat.app.AppCompatActivity;
import android.Manifest;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.hanjie.okhttpretrofit.net.INetCallBack;
import com.hanjie.okhttpretrofit.net.OkHttpUtils;
import java.util.HashMap;
public class MainActivity extends AppCompatActivity {
private Button mBtnGet;
private TextView mTvContent;
private Button mBtnPost;
private Button btn_post_multipart;
private Button btn_post_json;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();//初始化控件
initEvents();//初始化事件
}
private void initEvents() {
mBtnGet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发起网络请求
OkHttpUtils.getInstance().doGet("http://www.imooc.com/api/okhttp/getmethod?username=hyman", new INetCallBack() {
@Override
public void onSuccess(String response) {
mTvContent.setText(response);
}
@Override
public void onFailed(Throwable ex) {
Toast.makeText(MainActivity.this,"网络错误",Toast.LENGTH_LONG).show();
}
});
}
});
mBtnPost.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HashMap<String,String> params = new HashMap<>();
params.put("author","hanjie");
params.put("abc","okhttp");
OkHttpUtils.getInstance().doPost("http://www.imooc.com/api/okhttp/postmethod", null, new INetCallBack() {
@Override
public void onSuccess(String response) {
mTvContent.setText(response);
}
@Override
public void onFailed(Throwable ex) {
Toast.makeText(MainActivity.this,"网络错误",Toast.LENGTH_LONG).show();
}
});
}
});
btn_post_multipart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
HashMap<String,String> params = new HashMap<>();
params.put("author","hanjie");
params.put("abc","okhttp");
OkHttpUtils.getInstance().doPostMultiPart("http://www.imooc.com/api/okhttp/postmethod", params, new INetCallBack() {
@Override
public void onSuccess(String response) {
mTvContent.setText(response);
}
@Override
public void onFailed(Throwable ex) {
Toast.makeText(MainActivity.this,"网络错误",Toast.LENGTH_LONG).show();
}
});
}
});
btn_post_json.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OkHttpUtils.getInstance().doPostJson("http://www.imooc.com/api/okhttp/postjson", "{\"name\":\"hyman\",\"age\":12}", new INetCallBack() {
@Override
public void onSuccess(String response) {
mTvContent.setText(response);
}
@Override
public void onFailed(Throwable ex) {
Toast.makeText(MainActivity.this,"网络错误",Toast.LENGTH_LONG).show();
}
});
}
});
}
private void initView() {
mBtnGet=findViewById(R.id.btn_get);
mTvContent=findViewById(R.id.tv_content);
mBtnPost=findViewById(R.id.btn_post);
btn_post_multipart = findViewById(R.id.btn_post_multipart);
btn_post_json = findViewById(R.id.btn_post_json);
}
}
3:接口回调类INetCallBack.java
package com.hanjie.okhttpretrofit.net;
public interface INetCallBack {
void onSuccess(String response);
void onFailed(Throwable ex );
}
4:网络请求的工具类OkHttpUtils.java
package com.hanjie.okhttpretrofit.net;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.HashMap;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.logging.HttpLoggingInterceptor;
public class OkHttpUtils {
private Handler mUiHandler = new Handler(Looper.getMainLooper());
private OkHttpClient mOkHttpClient;
private OkHttpUtils(){
HttpLoggingInterceptor logging = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(@NotNull String message) {
Log.e("hanjie",message);
}
});
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
mOkHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
}
public static OkHttpUtils sInstance = new OkHttpUtils();
public static OkHttpUtils getInstance(){
return sInstance;
}
//GET:请求地址http://www.imooc.com/api/okhttp/getmethod?username=hyman&password=123
public void doGet(String url,INetCallBack callBack) {
Request request = new Request.Builder()
.url(url)
.build();
executeRequest(callBack, request);
}
public void doPost(String url, HashMap<String,String> params,INetCallBack callBack){
FormBody requestBody = null;
FormBody.Builder formBodyBuilder = new FormBody.Builder();
if (params!=null){
for (String param:params.keySet()){
formBodyBuilder.add(param,params.get(param));
}
}
Request request = new Request.Builder()
.url(url)
.post(formBodyBuilder.build())
.build();
executeRequest(callBack, request);
}
public void doPostMultiPart(String url, HashMap<String,String> params,INetCallBack callBack){
MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
multipartBodyBuilder.setType(MultipartBody.FORM);
if (params!=null){
for (String param:params.keySet()){
multipartBodyBuilder.addFormDataPart(param,params.get(param));
}
}
Request request = new Request.Builder()
.url(url)
.post(multipartBodyBuilder.build())
.build();
executeRequest(callBack, request);
}
public void doPostJson(String url,String jsonStr, INetCallBack callBack){
MediaType jsonMediaType = MediaType.get("application/json");
RequestBody requestBody =RequestBody.create(jsonStr,jsonMediaType);
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
executeRequest(callBack, request);
}
private void executeRequest(INetCallBack callBack, Request request) {
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String resStr = null;
try {
resStr = response.body().string();
} catch (IOException e) {
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onFailed(e);
}
});
return;
}
String finalRespStr = resStr;
mUiHandler.post(new Runnable() {
@Override
public void run() {
callBack.onSuccess(finalRespStr);
}
});
}
});
}
}