网络请求封装及使用(okhttp)

请求参数封装


import com.example.api.HttpClient;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**
 * Created by chun on 2016/6/22.
 */
public class BaseNetParams {
    public BaseNetParams() {

    }

    public BaseNetParams(String httpUrl, String method) {

        this.httpUrl = httpUrl;
        this.method = method;
        //数据保存策略
        this.params = "";
    }

    public static final String METHOD_GET = "get";
    public static final String METHOD_POST = "post";

    public String httpUrl;
    public String method = "post";// get post

    public File file;
    public String params;
    public boolean isCookie = false;
    public String sessionid;// header参数cookie
    public boolean isPicFile = false;

    public String filePath;
    public String fileName;
    public String BOUNDARY = java.util.UUID.randomUUID().toString();
    public String PREFIX = "--", LINEND = "\r\n";
    public String MULTIPART_FROM_DATA = "multipart/form-data";
    public String CHARSET = "UTF-8";

    public HashMap<String, String> paramsMap = new HashMap<>();
    public HashMap<String, File> paramsFiles = new HashMap<>();

    public HttpClient.DownLoadListener downloadProgressListener;
    public File downloadFile;
    public boolean isDownloadFile=false;

    public void initParams() {
        paramsMap.clear();
        paramsFiles.clear();
    }

    @SuppressWarnings("unchecked")
    public void initParams(HashMap<String, String> paramsMap) {
        this.paramsMap = paramsMap;
    }

    @SuppressWarnings("unchecked")
    public void initParams(HashMap<String, String> paramsMap, HashMap<String, File> paramsFile) {
        this.paramsMap = paramsMap;
        paramsFiles = (HashMap<String, File>) paramsFile.clone();
    }

    public void put(String k, String v) {
        paramsMap.put(k, v);
    }

    public String getParams() {
        Set<String> k = paramsMap.keySet();
        String connector = "?";
        if (METHOD_POST.equals(method)) {
            connector = "";
        }
        Iterator<String> i = null;
        if (k != null) {
            i = k.iterator();
        }
        if (k.size() == 1) {
            String temp = i.next();
            return connector + temp + "=" + paramsMap.get(temp);
        } else if (k.size() > 1) {
            StringBuffer sb = new StringBuffer();
            String temp = i.next();
            sb.append(connector + temp + "=" + paramsMap.get(temp));
            while (i.hasNext()) {
                temp = i.next();
                sb.append("&" + temp + "=" + paramsMap.get(temp));
            }
            return sb.toString();
        } else {
            return "";
        }
    }


    public Map<String, File> getFile() {
        return paramsFiles;
    }

}

请求引擎封装

import com.example.api.webinfo.BaseNetParams;
import com.example.model.utils.LogUtils;
import com.example.model.utils.TextUtils;

/**
 * Created by chun on 2016/6/21.
 */
public class JpmHttpEngine {
    private final static String TAG = "JpmHttpEngine";
    private static JpmHttpEngine jpmHttpEngine = new JpmHttpEngine();

    private JpmHttpEngine() {

    }

    public static JpmHttpEngine getInstance() {
        return jpmHttpEngine;
    }

    public String doRequest(BaseNetParams params) {
        HttpClient client = new HttpClient();
        String result = client.request(params);
        if (TextUtils.isEmpty(result)) {
            LogUtils.e(TAG, "----请求结果为空-----");
            return null;
        }
        return result;
    }
}

请求客户端(核心封装)

package com.example.api;

import android.os.Environment;
import android.util.Log;

import com.example.api.webinfo.BaseNetParams;
import com.example.api.webinfo.CookieUtils;
import com.example.model.utils.LogUtils;
import com.example.model.utils.TextUtils;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.FileCallBack;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Set;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.Buffer;
import okio.BufferedSource;
import okio.ForwardingSource;
import okio.Okio;
import okio.Source;

/**
 * Created by chun on 2016/6/22.
 */
public class HttpClient {
    private static String TAG = "HttpClient";
    private OkHttpClient client;

    public HttpClient() {

        client = new OkHttpClient();

    }

    public String request(BaseNetParams baseNetParams) {
        String result = null;
        LogUtils.e(TAG, "请求URL为:" + baseNetParams.httpUrl + "--请求方式为:" + baseNetParams.method);
        if (baseNetParams.isDownloadFile) {
            download(baseNetParams);
        } else {
            if (baseNetParams.paramsFiles != null && baseNetParams.paramsFiles.size() > 0)
                LogUtils.e(TAG, "请求参数为:" + baseNetParams.getParams() + "---size:" + baseNetParams.paramsFiles.size());
            else
                LogUtils.e(TAG, "请求参数为:" + baseNetParams.getParams());

            if (baseNetParams != null && baseNetParams.method == BaseNetParams.METHOD_GET) {
                result = doGet(baseNetParams);
            } else if (baseNetParams != null && baseNetParams.method == BaseNetParams.METHOD_POST && baseNetParams.paramsFiles != null && baseNetParams.paramsFiles.size() > 0) {
                result = doPostFile(baseNetParams);
            } else if (baseNetParams != null && baseNetParams.method == BaseNetParams.METHOD_POST) {
                result = doPost(baseNetParams);
            }
        }
        LogUtils.e(TAG, "服务器返回结果为:" + result);
        return result;
    }

    //post请求 在子线程
    private String doPost(BaseNetParams baseNetParams) {
        FormBody.Builder builder = new FormBody.Builder();
        Set<String> keys = baseNetParams.paramsMap.keySet();
        for (String key : keys) {
            builder.add(key, baseNetParams.paramsMap.get(key));
        }
//        HttpUrl url=HttpUrl.parse(baseNetParams.httpUrl);

        FormBody body = builder.build();
        Request.Builder requestBuilder = new Request.Builder().url(baseNetParams.httpUrl).post(body);
        if (!TextUtils.isEmpty(CookieUtils.getInstance().getSessionid())) {
            requestBuilder.header("Cookie", CookieUtils.getInstance().getSessionid());
        }
        Request request = requestBuilder.build();


        Response response = null;
        try {
            response = client.newCall(request).execute();

            List<String> cookies = response.headers("Set-Cookie");
            StringBuilder sb = new StringBuilder();
            if (cookies != null && cookies.size() > 0) {
                for (int i = 0; i < cookies.size(); i++) {
                    if (i == 0) {
                        sb.append(cookies.get(i).substring(0, cookies.get(i).indexOf(";")));
                    } else {
                        sb.append(";" + cookies.get(i).substring(0, cookies.get(i).indexOf(";")));
                    }
                }
            }
            LogUtils.e(TAG, sb.toString());
            if (!TextUtils.isEmpty(sb.toString())) {
                CookieUtils.getInstance().setSessionid(sb.toString());
            }
            if (response.isSuccessful()) {
                String result = response.body().string();
                return result;
            } else {
                LogUtils.e(TAG, "网络请求失败");
            }


        } catch (IOException e) {
            LogUtils.e(TAG, "网络请求失败,IO流错误" + e.getMessage());
        }

        return null;
    }

    public static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
    //上传文件  在子线程
    private String doPostFile(BaseNetParams baseNetParams) {

        // mImgUrls为存放图片的url集合
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        Set<String> keys = baseNetParams.paramsFiles.keySet();
        for (String key : keys) {
            File file = baseNetParams.paramsFiles.get(key);
            if (file != null) {
                builder.addFormDataPart(key, file.getName(), RequestBody.create(MEDIA_TYPE_PNG, file));
            }
        }

        HashMap<String, String> paramsMap = baseNetParams.paramsMap;
        if (paramsMap != null && baseNetParams.paramsMap.size() > 0) {
            Set<String> keySet = paramsMap.keySet();
            for (String key : keySet) {
                builder.addFormDataPart(key, paramsMap.get(key));
            }
        }

        //添加其它信息 在子线程
        MultipartBody requestBody = builder.build();

        Request.Builder requestBuilder = new Request.Builder().url(baseNetParams.httpUrl).post(requestBody);
        if (!TextUtils.isEmpty(CookieUtils.getInstance().getSessionid())) {
            requestBuilder.header("Cookie", "PHPSESSID=" + CookieUtils.getInstance().getSessionid());
        }
        Request request = requestBuilder.build();

        Response response = null;
        try {
            response = client.newCall(request).execute();
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
            String cookie = response.header("Set-Cookie");
            if (!TextUtils.isEmpty(cookie)) {
                String session = cookie.substring(cookie.indexOf("=") + 1, cookie.indexOf(";"));
                CookieUtils.getInstance().setSessionid(session);
            }
            String result = response.body().string();

            return result;

        } catch (IOException e) {
            LogUtils.e(TAG, "网络请求失败,IO流错误" + e.getMessage());
        }

        return null;
    }

    //get请求  在子线程
    private String doGet(BaseNetParams baseNetParams) {
        Request.Builder requestBuilder = new Request.Builder().url(baseNetParams.httpUrl);
        if (!TextUtils.isEmpty(CookieUtils.getInstance().getSessionid())) {
            requestBuilder.header("Cookie", "PHPSESSID=" + CookieUtils.getInstance().getSessionid());
        }
        Request request = requestBuilder.build();

        Response response = null;
        try {
            response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                String cookie = response.header("Set-Cookie");
                if (!TextUtils.isEmpty(cookie)) {
                    String session = cookie.substring(cookie.indexOf("=") + 1, cookie.indexOf(";"));
                    CookieUtils.getInstance().setSessionid(session);
                }

                return response.body().string();
            } else {
                LogUtils.e(TAG, "网络请求失败");
            }
        } catch (IOException e) {
            LogUtils.e(TAG, "网络请求失败,IO流错误" + e.getMessage());
        }
        return null;
    }

    public interface DownLoadListener {
        void onError(String msg);

        void inProgress(float progress, long total);

        void downloadOver();
    }
    //下载文件,这里使用的okhttpUtils  回调在主线程
    private void download(final BaseNetParams baseNetParams) {

        OkHttpUtils
                .get()
                .url(baseNetParams.httpUrl)
                .build()
                .execute(new FileCallBack(baseNetParams.downloadFile.getParentFile().getAbsolutePath(), baseNetParams.downloadFile.getName())
                {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        if (baseNetParams.downloadProgressListener != null) {
                            baseNetParams.downloadProgressListener.onError(e.getMessage());
                        }
                    }

                    @Override
                    public void onResponse(File response, int id) {
                        baseNetParams.downloadProgressListener.downloadOver();
                    }

                    @Override
                    public void inProgress(float progress, long total, int id) {
                        if (baseNetParams.downloadProgressListener != null) {
                            baseNetParams.downloadProgressListener.inProgress(progress, total);
                        }

                    }
                });

    }
}

gradle依赖的包

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.3.1'
    compile 'com.zhy:okhttputils:2.6.2'
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值