前置条件
在上传视频的功能模块中,涉及到视频、视频封面图片以及标题的上传,使用post请求上传
因此首先需要依赖okhttp库,在文件build.gradle(Module:你的项目名.app)的dependencies模块中添加
implementation("com.squareup.okhttp3:okhttp:4.9.3")
集成后在project视图中的External Libraries看到下图就可以使用了
使用
-
实例化一个OkHttpClient对象
OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(60000, TimeUnit.MILLISECONDS) .readTimeout(60000, TimeUnit.MILLISECONDS) .build();
connectTimeout
是设置链接超时时间
readTimeout
是设置读超时时间
- 设置上传的文件类型
MediaType contentType = MediaType.parse("multipart/form-data");
我的格式为表单上传
-
根据视频地址获得视频文件加入RequestBody中(这里使用了sharedPreference存储信息)
//获得视频 String path=userInfo.getString("videoPath",""); File file=new File(path); RequestBody body = RequestBody.create(contentType, file);
-
根据图片地址获得图片文件加入RequestBody中
//获得图片 String imagePath=userInfo.getString("imagePath",""); File imageFile=new File(imagePath); RequestBody imageBody = RequestBody.create(contentType, imageFile);
-
文件上传: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);
-
请求
RequestBody requestBody1 = requestBody.build(); Request request = new Request.Builder() .url("后端接口的链接") .post(requestBody1) .build(); Call call = client.newCall(request);
-
回调
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自带的抓包工具:
-
点击Android studio上方导航栏想汽车仪表盘一样的标志
-
然后出现下方的界面,点击Network Inspector
-
- 在真机调试或者虚拟机调试时,发送一个请求,会出现下方的折线
- 鼠标选择折线,可看到抓到的包,点击即可以看到请求的返回值,方法、状态等等信息,这样就抓包成功啦