栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

OkHttp请求数据格式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OkHttp请求数据格式

OkHttp请求数据格式




  • 准备操作
  • 请求数据



第一章 准备操作 第01节 导入资源库 1、位置
在 Gradle scripts 当中找到 build.gradle 在其中的 dependencies 里面需要导入 okhttp 的依赖。
2、代码
//需要导入 okhttp的操作
implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.2'




第02节 清单文件配置 1、权限设置




要点说明: 这里的用户权限 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



第03节 布局文件 1、位置
res/layout/activity_main.xml 
2、代码



    




第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、代码
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());
            }
        }
    });
}




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"));
    //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. 执行异步请求操作, 判断操作成功的情况下, 则输出日志





转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/340209.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号