关于okhttp框架的基本使用(上传文件,上传参数)
1、关于网络权限配置
关于安卓(27以上)http访问的配置
访问为https协议的话,略过即可
如果在android27以上,默认是不支持Http访问的了,需要使用https,如果你要使用Http明文访问,那么需要配置一下清单文件。
在清单文件,application节点,添加
android:networkSecurityConfig="@xml/network_security_config"
关于network_security_config文件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<domain-config>
<domain includeSubdomains="true">自己的域名</domain>
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">自己的域名</domain>
<domain includeSubdomains="true">自己的域名</domain>
</domain-config>
</domain-config>
</network-security-config>
此外还需要声明相关的网络权限和依赖:
权限: <uses-permission android:name="android.permission.INTERNET" />
依赖:在gradle文件: implementation("com.squareup.okhttp3:okhttp:4.2.2")
2、okhttp框架的实践
//GET请求
public void asyncGet(View view) {
String url = "某个get请求地址";
//1、创建client
OkHttpClient okHttpClient = new OkHttpClient();
//2、创建请求内容
Request request = new Request.Builder()
.url(url)
.get()
.build();
//3、用浏览器创建调用任务
Call call = okHttpClient.newCall(request);
//4、执行异步任务
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call,@NotNull IOException e) {
Log.d(TAG,"onFailure " + e.toString());
}
@Override
public void onResponse(@NotNull Call call,@NotNull Response response) throws IOException {
Log.d(TAG,"response " + response.body().string());
//异步处理返回数据后,在这里进行进行数据更新操作,例如利用handle更新ui等
}
});
}
//POST请求
public void doSearch(View view) {
String url = "需要post的uri";
RequestBody requestBody = new FormBody.Builder()
.add("test","test")
.build();
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.post(requestBody)//post请求要求输入一个RequestBody对象
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call,@NotNull IOException e) {
Log.d(TAG,"onFailure " + e.toString());
}
@Override
public void onResponse(@NotNull Call call,@NotNull Response response) throws IOException {
Log.d(TAG,"response " + response.body().string());
}
});
}
在上述代码中
我们可以看到如上的继承关系,所以在post请求中的RequeBody需要根据情况实例化
RequestBody requestBody = new FormBody.Builder()//表单式提交后面可以通过"."查看相应的参数
RequestBody requestBody = new MultipartBody.Builder()//一般用于文件提交/多文件提交等,其中里面涉及相关的类型设置,请自行查阅相关的文档
RequestBody requestBody = RequesBody.create()//一般用于单个参数的提交
//文件上传
public void postFile(View view) {
String url = "自己的url'";
OkHttpClient httpClient = new OkHttpClient.Builder().build();
File file = new File("文件路径");
MediaType mediaType = MediaType.parse("文件类型");
RequestBody fileBody = RequestBody.create(file,mediaType);
RequestBody requestBody = new MultipartBody.Builder()
.addFormDataPart("后台接口key",file.getName(),fileBody)//可以多个,在多文件上传运用
.build();
Request request = new Request.Builder().url(url).post(requestBody).build();
Call call = httpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call,@NotNull IOException e) {
Log.d(TAG,"上传失败 " + e.toString());
}
@Override
public void onResponse(@NotNull Call call,@NotNull Response response) throws IOException {
Log.d(TAG,"上传结果:" + response.body().string());
//处理其他
}
});
}
基本的okhhtp基本运用展示到此结束,该框架帮我们实现了配置请求体的工作,有兴趣的朋友可以查看框架的原理实现。