安卓使用okhttp框架接后端接口&&如何抓包

本文介绍了如何在安卓应用中使用OkHttp框架进行文件上传,包括视频和图片,详细讲解了依赖引入、超时设置、RequestBody创建等步骤。同时,手把手教学如何利用Android Studio内置的Network Inspector进行抓包,以便于前后端联调时查看请求和响应详情。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前置条件

​ 在上传视频的功能模块中,涉及到视频、视频封面图片以及标题的上传,使用post请求上传

因此首先需要依赖okhttp库,在文件build.gradle(Module:你的项目名.app)的dependencies模块中添加

implementation("com.squareup.okhttp3:okhttp:4.9.3")

集成后在project视图中的External Libraries看到下图就可以使用了

在这里插入图片描述

使用

  1. 实例化一个OkHttpClient对象

    OkHttpClient client = new OkHttpClient.Builder()
                        .connectTimeout(60000, TimeUnit.MILLISECONDS)
                        .readTimeout(60000, TimeUnit.MILLISECONDS)
                        .build();
    

connectTimeout是设置链接超时时间

readTimeout是设置读超时时间

  1. 设置上传的文件类型
MediaType contentType = MediaType.parse("multipart/form-data");

我的格式为表单上传

  1. 根据视频地址获得视频文件加入RequestBody中(这里使用了sharedPreference存储信息)

    //获得视频
    String path=userInfo.getString("videoPath","");
    File file=new File(path);
    RequestBody body = RequestBody.create(contentType, file);
    
  2. 根据图片地址获得图片文件加入RequestBody中

    //获得图片
    String imagePath=userInfo.getString("imagePath","");
    File imageFile=new File(imagePath);
    RequestBody imageBody = RequestBody.create(contentType, imageFile);
    
  3. 文件上传:addFormDataPart的第一个参数,为后端接口的字段名

    MultipartBody.Builder requestBody = new MultipartBody.Builder()
                        .setType(MultipartBody.FORM)
                        .addFormDataPart("videoFile", System.currentTimeMillis()+"file.mp4", body)//System.currentTimeMillis为获取当前计算机的时间作为文件的名字
                        .addFormDataPart("pictureFile", System.currentTimeMillis()+"image.jpg", imageBody)
                        .addFormDataPart("cid", "20")
                        .addFormDataPart("vname", str)
                        .addFormDataPart("vstyle", classicStr);
    
  4. 请求

    RequestBody requestBody1 = requestBody.build();
    Request request = new Request.Builder()
          .url("后端接口的链接")
          .post(requestBody1)
          .build();
    Call call = client.newCall(request);
    
  5. 回调

    call.enqueue(new Callback() {
                    @Override
                    public void onFailure(@NonNull Call call, @NonNull IOException e) {
                        Log.e("TAG", "onFailure: ------文件上传失败");
                        if (progressDialog.isShowing()) {
                            progressDialog.dismiss();
                            Looper.prepare();
                            Log.d("TAG", "onFailure: ------" + e);
                            Toast.makeText(getActivity(), "视频上传失败", Toast.LENGTH_SHORT).show();
                            Looper.loop();
                        }
                        Log.d("TAG", "onFailure: -------" + e);
                    }
    
                    @SuppressLint("ResourceType")
                    @Override
                    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
                        if (response.isSuccessful()) {
                            Log.i("Haoxueren", "onResponse: " + response.body().string());
                            long end = System.currentTimeMillis();
                            long result = end - start;
                            if (progressDialog.isShowing()) {
                                progressDialog.dismiss();
                                Looper.prepare();
                                Toast.makeText(getActivity(), "视频上传成功", Toast.LENGTH_SHORT).show();
                                SharedPreferences.Editor editor = userInfo.edit();
                                editor.clear();
                                editor.commit();
                                classicStr=null;
                                Log.d("TAG", "onResponse: -----aaaa!");
                                getActivity().getSupportFragmentManager()
                                        .beginTransaction()
                                        .replace(R.id.fl_main, new ContactListFragment(), null)
                                        .commitAllowingStateLoss();
                                Log.d("TAG", "onResponse: ------跳转!");
                                Looper.loop();
                            }
    
                        } else {
                            Log.i("Haoxueren", "onResponse: " + response.message());
                            if (progressDialog.isShowing()) {
                                progressDialog.dismiss();
                                Looper.prepare();
                                Toast.makeText(getActivity(), "视频上传失败", Toast.LENGTH_SHORT).show();
                                Looper.loop();
                            }
                        }
                    }
                });
    

    手把手教抓包

    ​ 一般之前写安卓都是前后端同步开发,不需要前后端分离,在这里抓包是因为开发需要,后端能够脱离安卓,因此使用okhttp前后端联调,联调难免会出现错误,我发现手机没办法像网页一样,进行抓包,网络上也有一些辅助抓包的工具,这里我介绍Android studio自带的抓包工具:

    1. 点击Android studio上方导航栏想汽车仪表盘一样的标志
      请添加图片描述

    2. 然后出现下方的界面,点击Network Inspector

请添加图片描述

  1. 在真机调试或者虚拟机调试时,发送一个请求,会出现下方的折线

请添加图片描述

  1. 鼠标选择折线,可看到抓到的包,点击即可以看到请求的返回值,方法、状态等等信息,这样就抓包成功啦
    请添加图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值