okHttpUtil类封装
package com.nyw.okhttpjavademo.util;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.logging.HttpLoggingInterceptor;
/**
* OkHttpClient的封装类
*/
public class OkUtils {
private OkHttpClient okHttpClient;
private OkUtils() {
//日志拦截器
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)//响应时间,读取时间
.readTimeout(20, TimeUnit.SECONDS)
.callTimeout(20, TimeUnit.SECONDS)
.addInterceptor(loggingInterceptor)//添加日志拦截器
.build();
}
//静态内部类单例模式
public static OkUtils getInstance() {
return OkHolder.okUtils;
}
static class OkHolder {
private static final OkUtils okUtils = new OkUtils();
}
//这是同步的get和post
public String getSync(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
return okHttpClient.newCall(request).execute().body().string();
}
public String postSync(String url, String key, String value) throws IOException {
RequestBody body = new FormBody.Builder().add(key, value).build();
Request request = new Request.Builder().url(url).post(body).build();
return okHttpClient.newCall(request).execute().body().string();
}
//异步的get和post
public void getAsync(String url, Callback callback) {
Request request = new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(callback);
}
public void postAsync(String url, Callback callback) {
RequestBody body = new FormBody.Builder().add("key", "value").build();
Request request = new Request.Builder().url(url).post(body).build();
okHttpClient.newCall(request).enqueue(callback);
}
}
okHttp使用
package com.nyw.okhttpjavademo;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okio.BufferedSink;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_get,btn_get_asyn,btn_post,btn_post_asyn,btn_download;
private OkHttpClient okHttpClient;
private Request request;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intiView();
}
private void intiView() {
btn_get=findViewById(R.id.btn_get);
btn_get_asyn=findViewById(R.id.btn_get_asyn);
btn_post=findViewById(R.id.btn_post);
btn_post_asyn=findViewById(R.id.btn_post_asyn);
btn_download=findViewById(R.id.btn_download);
btn_get.setOnClickListener(this);
btn_get_asyn.setOnClickListener(this);
btn_post.setOnClickListener(this);
btn_post_asyn.setOnClickListener(this);
btn_download.setOnClickListener(this);
okHttpClient=new OkHttpClient();
}
@Override
public void onClick(View view) {
int id=view.getId();
switch (id){
case R.id.btn_get:
//get 同步请求,同步请求必须放在线程里执行
new Thread(new Runnable() {
@Override
public void run() {
request = new Request.Builder().url("http://wwww.baidu.com").build();
Call call=okHttpClient.newCall(request);
Response response;
try {
response = call.execute();
Log.i("skfjskfsnfff","execute get同步请求");
if (response.isSuccessful()){
Log.i("skfjskfsnfff","get同步请求");
Log.i("skfjskfsnfff",response.body().byteString().toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
break;
case R.id.btn_get_asyn:
//get 异步请求
getAsyn("http://www.baidu.com");
break;
case R.id.btn_post:
//post 同步请求
sendSynchronizationPost("http://www.baidu.com");
break;
case R.id.btn_post_asyn:
//post 异步请求
postData("http://www.baidu.com");
break;
case R.id.btn_download:
//下载文件
break;
}
}
/**
* post 同步请求,同步请求要在线程中执行
*/
private void sendSynchronizationPost(String url) {
new Thread(new Runnable() {
@Override
public void run() {
try {
//1:学什么都能new出一个对象来
OkHttpClient okHttpClient = new OkHttpClient();
//创建请求体
RequestBody requestBody = new FormBody.Builder()
.add("mobile", "18513426687")//键值对的形式
.build();
//Request就是请求的类
Request request = new Request.Builder().url(url).post(requestBody).build();
//发送请求newCall方法
Call call = okHttpClient.newCall(request);
//通过call去处理给你响应Response
Response response = call.execute();
final String string = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, string, Toast.LENGTH_SHORT).show();
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
/**
* get 异步请求
* @param url
*/
public void getAsyn(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//访问错误回调
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
//访问接口成功回调
String result = response.body().string();
Log.i("sdlfmsfklsgnfkff",result);
//处理UI需要切换到UI线程处理
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
isUpdate( isShow);
}
});
}
}
});
}
/**
* post提交表单
*/
private void postData(String url){
OkHttpClient okHttpClient = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("search", "Jurassic Park")
.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.d("fklsjlfkjsdksfjskfjs", "onFailure: " + e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("fklsjlfkjsdksfjskfjs", response.protocol() + " " +response.code() + " " + response.message());
Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_SHORT).show();
Headers headers = response.headers();
for (int i = 0; i < headers.size(); i++) {
Log.d("fklsjlfkjsdksfjskfjs", headers.name(i) + ":" + headers.value(i));
}
Log.d("fklsjlfkjsdksfjskfjs", "onResponse: " + response.body().string());
}
});
}
}