- 准备操作
- 请求数据
在 Gradle scripts 当中找到 build.gradle 在其中的 dependencies 里面需要导入 okhttp 的依赖。2、代码
//需要导入 okhttp的操作 implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
要点说明: 这里的用户权限 SDcard 权限,在Android M 6.0 以上版本需要指定动态权限设置。
参考资料: https://developer.android.google.cn/guide/topics/permissions/overview
2、高版本设置
要点说明:这里需要在 application 当中添加 android:requestLegacyExternalStorage=“true” 完成设置
参考资料: https://developer.android.google.cn/about/versions/11/privacy/storage
res/layout/activity_main.xml2、代码
java/MainActivity 代码实现2、代码
public class MainActivity extends AppCompatActivity{
private OkHttpClient okhttp;
private String TAG = "MainActivity";
//定义请求码
private static final int REQUEST_CODE = 1;
//定义权限信息
String[] permissionArray = {
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnMuch = this.findViewById(R.id.btn_much);
Button btnJson = this.findViewById(R.id.btn_json);
okhttp = new OkHttpClient();
//设置点击事件处理
btnMuch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//检查权限,如果成功则POST提交
checkPermission();
}
});
//设置点击事件处理
btnJson.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//直接提交JSON格式的数据
submitJsonData();
}
});
}
}
public void checkPermission(){
if (Build.VERSION.SDK_INT >= M){
//如果大于6.0的版本,则检查是否包含有写SDcard的权限
int isPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
//如果存在权限,则直接提交数据
if (isPermission == PackageManager.PERMISSION_GRANTED){
submitFileData();
}else{
//如果没有权限,则需要动态申请权限
ActivityCompat.requestPermissions(this,permissionArray,REQUEST_CODE);
}
}else{
//如果当前的版本小于6.0 则直接提交文件信息
submitFileData();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//判断请求码
if (requestCode == REQUEST_CODE){
if (grantResults!=null && grantResults.length>0){
//判断用户是否授予了这个权限
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
submitFileData();
}else{
Toast.makeText(this,"您拒绝了权限!~",Toast.LENGTH_LONG).show();
}
}
}
}
public void submitFileData() {
File skRoot = Environment.getExternalStorageDirectory();
File file1 = new File(skRoot, "mytest/hello01.txt");
File file2 = new File(skRoot, "mytest/hello02.txt");
Log.i(TAG, "onClick: file1 = " + file1.exists());
Log.i(TAG, "onClick: file2 = " + file2.exists());
//需要实现多模块提交的 Builder的对象
MultipartBody.Builder builder = new MultipartBody.Builder();
//添加多模块提交的数据参数(两个文件和一个键值对)
builder.addFormDataPart("file1", file1.getName(), RequestBody.create(file1, MediaType.parse("text/plain")));
builder.addFormDataPart("file2", file2.getName(), RequestBody.create(file2, MediaType.parse("text/plain")));
builder.addFormDataPart("a", "1");
//多模块整体作为参数传递给POST请求
MultipartBody multipartBody = builder.build();
//1、准备好请求的对象
Request request = new Request.Builder().url("https://www.httpbin.org/post").post(multipartBody).build();
//2、准备回调的操作
Call call = okhttp.newCall(request);
//3、执行异步请求的情况
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i(TAG, "onFailure: --->" + e.getMessage());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
//如果访问成功,则给出数据响应
if (response.isSuccessful()) {
Log.i(TAG, "onResponse: POST-MULTIPART " + response.body().string());
}
}
});
}
主要有三个方法: 1、检查权限的方法 A. 如果版本低于 6.0 则直接提交数据 B. 如果版本高于 6.0 则判断权限情况 a. 如果开启了权限,则直接提交数据 b. 如果未开启权限,则需要动态申请权限 2、申请全选的回调方法(无论授权成功或授权失败都会执行此方法) A. 判断状态码时候成功 B. 判断用户时候授予了权限 a. 如果授予了权限,则直接提交数据 b. 如果未授予权限,则给出吐司提示 3、提交成功的方法 A. 获取到 SDcard 的根目录信息 B. 封装成为多个 File 的对象 C. 组拼多个模块的提交Builder的对象 D. 多模块作为参数传递给 POST 请求 E. 准备回调的操作消费掉请求 F. 执行异步请求的情况
public void submitJsonData() {
String json = "{"a":1,"b":2}";
RequestBody requestBody = RequestBody.create(json, MediaType.parse("application/json"));
//1、获取到请求参数数据
Request request = new Request.Builder().url("https://www.httpbin.org/post").post(requestBody).build();
//2、提交请求给数据
Call call = okhttp.newCall(request);
//3、执行异步请求
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
//判断是否执行成功
if (response.isSuccessful()){
//展示结果
Log.i(TAG, "onResponse: SUBMIT-JSON:"+response.body().string());
}
}
});
}
1. 准备需要的JSON数据, 封装成为请求体 RequestBody 2. 提交请求参数数据, 到请求中 Request 3. 准备回调的请求对象 Call 4. 执行异步请求操作, 判断操作成功的情况下, 则输出日志



