IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> OkHttp请求数据格式 -> 正文阅读

[移动开发]OkHttp请求数据格式

OkHttp请求数据格式




  • 准备操作
  • 请求数据



第一章 准备操作

第01节 导入资源库

1、位置

在 Gradle Scripts 当中找到 build.gradle 在其中的 dependencies 里面需要导入 okhttp 的依赖。

2、代码

//需要导入 okhttp的操作
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'




第02节 清单文件配置

1、权限设置

<!--  添加用户权限,访问网络的权限设置   -->
<uses-permission android:name="android.permission.INTERNET" />
<!--  添加用户权限,访问SDcard权限  -->
<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、高版本设置

<!--  在Android10以后的情况下,需要在 application 当中添加一句话 android:requestLegacyExternalStorage="true"   -->
<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) {
                //检查权限,如果成功则POST提交
                checkPermission();
            }
        });
        //设置点击事件处理
        btnJson.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                //直接提交JSON格式的数据
                submitJsonData();
            }
        });
    }
}





第二章 请求数据

第01节 动态授权

1、代码

/***
 * 检查权限的方法
 * 1、判断手机系统时候大于或等于6.0
 * 2、如果大于6.0 则需要检查是否拥有访问SDcard的权限
 * 3、检查是否存在访问SDcard的权限,访问SDcard的权限是否授权
 * 4、如果有访问SDcard的权限,则直接提交数据
 * 5、如果没有大于6.0 这直接提交数据
 */
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();
    }
}


/***
 * 申请权限的回调方法,无论成功或者失败,都会调用这个函数。
 * @param requestCode 上文当中提到的请求码
 * @param permissions 申请的权限
 * @param grantResults 申请的结果
 */
@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());
            }
        }
    });
}




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、代码

/****
 * 直接提交JSON格式的数据
 */
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());
            }
        }
    });
}



2、小结

1. 准备需要的JSON数据, 封装成为请求体  RequestBody
2. 提交请求参数数据, 到请求中 Request
3. 准备回调的请求对象 Call
4. 执行异步请求操作, 判断操作成功的情况下, 则输出日志





  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-22 11:03:19  更:2021-10-22 11:03:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:10:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码