OkHttp请求数据格式
第一章 准备操作
第01节 导入资源库
1、位置
在 Gradle Scripts 当中找到 build.gradle 在其中的 dependencies 里面需要导入 okhttp 的依赖。
2、代码
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'
第02节 清单文件配置
1、权限设置
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
要点说明: 这里的用户权限 SDcard 权限,在Android M 6.0 以上版本需要指定动态权限设置。
参考资料: https://developer.android.google.cn/guide/topics/permissions/overview
2、高版本设置
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:requestLegacyExternalStorage="true"
要点说明:这里需要在 application 当中添加 android:requestLegacyExternalStorage=“true” 完成设置
参考资料: https://developer.android.google.cn/about/versions/11/privacy/storage
第03节 布局文件
1、位置
res/layout/activity_main.xml
2、代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
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_much"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击运行多数据加载"/>
<Button
android:id="@+id/btn_json"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击运行JSON数据加载"/>
</LinearLayout>
第04节 Activity准备
1、位置
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) {
checkPermission();
}
});
btnJson.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
submitJsonData();
}
});
}
}
第二章 请求数据
第01节 动态授权
1、代码
public void checkPermission(){
if (Build.VERSION.SDK_INT >= M){
int isPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (isPermission == PackageManager.PERMISSION_GRANTED){
submitFileData();
}else{
ActivityCompat.requestPermissions(this,permissionArray,REQUEST_CODE);
}
}else{
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());
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");
MultipartBody multipartBody = builder.build();
Request request = new Request.Builder().url("https://www.httpbin.org/post").post(multipartBody).build();
Call call = okhttp.newCall(request);
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());
}
}
});
}
2、小结
主要有三个方法:
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. 执行异步请求的情况
第02节 提交JSON
1、代码
public void submitJsonData() {
String json = "{\"a\":1,\"b\":2}";
RequestBody requestBody = RequestBody.create(json, MediaType.parse("application/json"));
Request request = new Request.Builder().url("https://www.httpbin.org/post").post(requestBody).build();
Call call = okhttp.newCall(request);
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());
}
}
});
}
2、小结
1. 准备需要的JSON数据, 封装成为请求体 RequestBody
2. 提交请求参数数据, 到请求中 Request
3. 准备回调的请求对象 Call
4. 执行异步请求操作, 判断操作成功的情况下, 则输出日志
|