1.导入依赖
implementation 'com.squareup.okhttp3:okhttp:4.9.1'
2.申请权限
<uses-permission android:name="android.permission.INTERNET"/>
android10 以上要在manifest下声明 :android:usesCleartextTraffic="true"
3.get请求
public void getRq(){
OkHttpClient okHttpClient = new OkHttpClient();
Request request = new Request.Builder().get().url("http://www.baidu.com/").build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.e(TAG,e.toString());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
Log.e(TAG,response.body().string());
}
});
}
4.post请求
public void postQQ(){
OkHttpClient okHttpClient = new OkHttpClient();
//提交键值对
FormBody formBody = new FormBody.Builder().
add("username","2545993152@qq.com").
add("password","eandhhds").
build();
//提交字符串
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("name","dddd");
} catch (JSONException e) {
e.printStackTrace();
}
RequestBody requestBody = RequestBody.create(MediaType.parse("text/plain;charset=utf-8"), "{username:admin;password:admin}");
//上传文件
File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
Log.e(TAG,"文件不存在");
}else{
RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file);
}
Request request = new Request.Builder().url("http://www.jianshu.com/")
.post(formBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.e(TAG,e.toString());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
Log.e(TAG,response.body().string());
}
});
}
5.复杂表单
public void postMultiForm(){
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("username", "admin")//
.addFormDataPart("password", "admin")//
.addFormDataPart("myfile", "1.png", RequestBody.create(MediaType.parse("application/octet-stream"), file));
}
6.下载文件
导入依赖:
implementation 'com.squareup.okio:okio:2.8.0'
public void downloadImg(View view){
OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.get()
.url("https://www.baidu.com/img/bd_logo1.png")
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e("moer", "onFailure: ");;
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//拿到字节流
InputStream is = response.body().byteStream();
int len = 0;
File file = new File(Environment.getExternalStorageDirectory(), "n.png");
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1){
fos.write(buf, 0, len);
}
fos.flush();
//关闭流
fos.close();
is.close();
}
});
}
下载的图片设置到 imageview
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = response.body().byteStream();
final Bitmap bitmap = BitmapFactory.decodeStream(is);
runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
is.close();
}
7.增加 进度条:
下载:
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream is = response.body().byteStream();
long sum = 0L;
//文件总大小
final long total = response.body().contentLength();
int len = 0;
File file = new File(Environment.getExternalStorageDirectory(), "n.png");
FileOutputStream fos = new FileOutputStream(file);
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1){
fos.write(buf, 0, len);
//每次递增
sum += len;
final long finalSum = sum;
Log.d("pyh1", "onResponse: " + finalSum + "/" + total);
runOnUiThread(new Runnable() {
@Override
public void run() {
//将进度设置到TextView中
contentTv.setText(finalSum + "/" + total);
}
});
}
fos.flush();
fos.close();
is.close();
}
上传:
自定义类继承RequestBody
,然后重写其中的方法,将其中的上传进度通过接口回调暴露出来供我们使用。
public class CountingRequestBody extends RequestBody {
//实际起作用的RequestBody
private RequestBody delegate;
//回调监听
private Listener listener;
private CountingSink countingSink;
/**
* 构造函数初始化成员变量
* @param delegate
* @param listener
*/
public CountingRequestBody(RequestBody delegate, Listener listener){
this.delegate = delegate;
this.listener = listener;
}
@Override
public MediaType contentType() {
return delegate.contentType();
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
countingSink = new CountingSink(sink);
//将CountingSink转化为BufferedSink供writeTo()使用
BufferedSink bufferedSink = Okio.buffer(countingSink);
delegate.writeTo(bufferedSink);
bufferedSink.flush();
}
protected final class CountingSink extends ForwardingSink{
private long byteWritten;
public CountingSink(Sink delegate) {
super(delegate);
}
/**
* 上传时调用该方法,在其中调用回调函数将上传进度暴露出去,该方法提供了缓冲区的自己大小
* @param source
* @param byteCount
* @throws IOException
*/
@Override
public void write(Buffer source, long byteCount) throws IOException {
super.write(source, byteCount);
byteWritten += byteCount;
listener.onRequestProgress(byteWritten, contentLength());
}
}
/**
* 返回文件总的字节大小
* 如果文件大小获取失败则返回-1
* @return
*/
@Override
public long contentLength(){
try {
return delegate.contentLength();
} catch (IOException e) {
return -1;
}
}
/**
* 回调监听接口
*/
public static interface Listener{
/**
* 暴露出上传进度
* @param byteWritted 已经上传的字节大小
* @param contentLength 文件的总字节大小
*/
void onRequestProgress(long byteWritted, long contentLength);
}
}
File file = new File(Environment.getExternalStorageDirectory(), "1.png");
if (!file.exists()){
Toast.makeText(this, "文件不存在", Toast.LENGTH_SHORT).show();
}else{
RequestBody requestBody2 = RequestBody.create(MediaType.parse("application/octet-stream"), file);
}
//使用我们自己封装的类
CountingRequestBody countingRequestBody = new CountingRequestBody(requestBody2, new CountingRequestBody.Listener() {
@Override
public void onRequestProgress(long byteWritted, long contentLength) {
//打印进度
Log.d("pyh", "进度 :" + byteWritted + "/" + contentLength);
}
});