OKhttp网络请求支持(raw,from-data)提交实战版本更新安装(请求表单,上传图片,上传多张图片)

本文介绍了如何使用OkHttp进行网络请求,包括表单提交、图片上传和raw数据上传。通过添加依赖、配置权限,结合RxJava和Glide库,实现图片压缩和多图上传。同时,提供了软件更新的配置步骤,解决了华为手机的内部安装权限问题。
摘要由CSDN通过智能技术生成

今天和大家分享一个okhttp网络请求的实战案例,欢迎新手学生,大佬指点,话不多说直接上干货。

我是直接手动添加的架包,手动导入,记住一定要导入。添加依赖也可以哈,看个人爱好(要架包的私信或者留言,留邮箱,或者什么我发给你们)

然后在添加依赖:(允许我装个x用rxjava2了,加载图片用的是glide,支持多张上传图片)

implementation 'io.reactivex.rxjava2:rxjava:2.2.19'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
    implementation 'com.google.code.gson:gson:2.8.5'

最重要的一步来了,记住了 添加网络权限:

!--相机权限-->
    <uses-permission android:name="android.permission.CAMERA" />
    <!--读文件权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!--使用特性-->
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.INTERNET" />

配置的都差不多准备完成了开始干代码吧:用rxjava接口是要有的:

public interface MyNetWorkCallback<T> {

    void onSuccess(T t);
    void onError(int errorCode, String errorMsg);

}

继续在上:

public interface IHttp {
    <T> void get(String url, MyNetWorkCallback<T> callback);
    <T> void get(String url, Map<String, String> params, MyNetWorkCallback<T> callback);
    <T> void get(String url, Map<String, String> params, Map<String, String> headers, MyNetWorkCallback<T> callback);
    <T> void post(String url, Map<String, String> params, MyNetWorkCallback<T> callback);
    <T> void postraw(String url, String params, MyNetWorkCallback<T> callback);
    <T> void postrawfile(String url, File file, MyNetWorkCallback<T> callback);
    void upload(String url, String path, Map<String, String> params, String fileType, MediaType MEDIA_TYPE, final MyNetWorkCallback<String> callback);
    <T> void download(String url,MyNetWorkCallback<String> callback);
    void loadImage(String url, ImageView imageView);

}

这个类干啥来的忘记了,场时间不用了,但是也写山了,你们可以不用

public class HttpFactroy {
    public static IHttp create(){
        return OkHttpUtils.getInstance();
    }
}

主要的类来了,单例走起:

public class OkHttpUtils implements IHttp {

    private OkHttpClient okHttpClient;

    //构造函数私有化
    private OkHttpUtils() {
        okHttpClient = new OkHttpClient.Builder().build();
    }

    private static OkHttpUtils okHttpUtils;

    //提供一个公共的、静态的、返回值类型是当前本类的对象
    public static OkHttpUtils getInstance() {
        if (okHttpUtils == null) {
            synchronized (OkHttpUtils.class) {
                if (okHttpUtils == null) {
                    okHttpUtils = new OkHttpUtils();
                }
            }
        }
        return okHttpUtils;
    }

    private ProgressDialog progressDialog;

    @Override
    public <T> void get(String url, MyNetWorkCallback<T> callback) {

    }

    /**
     * 上传多张图片及参数
     *
     * @param reqUrl   URL地址
     * @param paramssa 参数
     * @param pic_key  上传图片的关键字
     * @return
     */
    public Observable<String> sendMultipart(final String reqUrl, final Map<String, String> paramssa, final String pic_key, final List<File> filessa) {
        return Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                MultipartBody.Builder multipartBodyBuilder = new MultipartBody.Builder();
                multipartBodyBuilder.setType(MultipartBody.FORM);
                //遍历map中所有参数到builder
                if (paramssa != null) {
                    for (String key : paramssa.keySet()) {
                        multipartBodyBuilder.addFormDataPart(key, paramssa.get(key));
                    }
                }
                //遍历paths中所有图片绝对路径到builder,并约定key如“upload”作为后台接受多张图片的key
                if (filessa != null) {
                    for (File file : filessa) {
                        multipartBodyBuilder.addFormDataPart(pic_key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
                    }
                }
                //构建请求体
                RequestBody requestBody = multipartBodyBuilder.build();
                Request.Builder RequestBuilder = new Request.Builder();
                RequestBuilder.url(reqUrl);// 添加URL地址
                RequestBuilder.post(requestBody);
                Request request = RequestBuilder.build();
                okHttpClient.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        emitter.onError(e);
                        emitter.onComplete();
                        call.cancel();
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        String str = response.body().string();
                        emitter.onNext(str);
                        emitter.onComplete();
                        call.cancel();
                    }
                });
            }
        });
    }

    /**
     * 发送get请求
     *
     * @param url      请求地址
     * @param params   请求参数
     * @param callback 回调
     * @param <T>      请求回来的数据对应的JavaBean
     */
    @Override
    public <T> void get(String url, Map<String, String> params, final MyNetWorkCallback<T> callback) {
        StringBuffer sb = new StringBuffer(url);
        if (params != null && params.size() > 0) {
            sb.append("?");
            Set<String> keys = params.keySet();
            for (String key : keys) {
                String value = params.get(key);
                sb.append(key).append("=").append(value).append("&");
            }
            url = sb.deleteCharAt(sb.length() - 1).toString();
        }
        Request request = new Request.Builder().url(url).build();
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                App.context.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        //执行在主线程
                        callback.onError(404, e.getMessage().toString());
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String jsonData = response.body().string();
                //执行在子线程中
                App.context.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
   
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值