Android 网络请求 HttpURLConnection 原生网络请求

HttpURLConnection

 

package com.example.administrator.words.http;

import android.os.AsyncTask;
import android.text.TextUtils;
import android.util.Log;

import com.example.administrator.words.util.ToastUtil;
import com.google.gson.Gson;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by ldp.
 * <p>
 * Date: 2021-01-30
 * <p>
 * Summary: 安卓原生异步网络请求封装 单例设计模式 异步任务实现 异步请求
 */
public class HttpHelper {

    private HttpHelper() {

    }

    public static HttpHelper getInstance() {
        return Instance.INSTANCE;
    }

    private static final class Instance {
        private static final HttpHelper INSTANCE = new HttpHelper();
    }

    /**
     * 异步请求
     */
    private static class HttpTask extends AsyncTask<Object, Integer, Object> {

        private final WeakReference<HttpCallback> callback;
        private HttpRequestParams requestParams;

        public HttpTask(HttpCallback callback) {
            this.callback = new WeakReference<>(callback);
        }

        @Override
        protected Object doInBackground(Object... objects) {

            if (objects.length > 0) {
                this.requestParams = (HttpRequestParams) objects[0];
                HttpURLConnection connection = null;
                StringBuilder result = new StringBuilder("");
                try {

                    if (requestParams.getRequestMethod() == HttpRequestMethod.GET) {
                        // get请求

                        // 拼接参数 因为 get请求 参数要拼接在 后面 所以要先拼接
                        if (requestParams.getParamsMap().size() > 0) {
                            String requestUrl = requestParams.getRequestUrl();
                            StringBuilder builder = new StringBuilder(requestUrl);
                            builder.append("?");
                            for (Map.Entry<String, String> item : requestParams.getParamsMap().entrySet()) {
                                if (!builder.toString().endsWith("?")) {
                                    builder.append("&");
                                }
                                builder.append(item.getKey()).append("=")
                                        .append(isContainChinese(item.getValue())
                                                ? URLEncoder.encode(item.getValue(), "UTF-8")
                                                : item.getValue());
                            }
                            requestParams.setRequestUrl(builder.toString());
                        }
                        URL url = new URL(requestParams.getRequestUrl());

                        Log.e("httpUrl",requestParams.getRequestUrl());

                        connection = (HttpURLConnection) url.openConnection();

                        if (!TextUtils.isEmpty(requestParams.getContentType())){
                            connection.addRequestProperty("Content-Type",requestParams.getContentType());
                        }
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        connection.setRequestMethod(HttpRequestMethod.GET.name());
                    } else if (requestParams.getRequestMethod() == HttpRequestMethod.POST) {
                        // post 请求
                        URL url = new URL(requestParams.getRequestUrl());

                        Log.e("httpUrl",requestParams.getRequestUrl());

                        connection = (HttpURLConnection) url.openConnection();

                        if (!TextUtils.isEmpty(requestParams.getContentType())){
                            // header 设置 Content-Type 有别的需求可以加在这里
                            connection.addRequestProperty("Content-Type",requestParams.getContentType());
                        }
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);

                        connection.setRequestMethod(HttpRequestMethod.POST.name());
                        // post 请求要设置
                        connection.setDoInput(true);
                        connection.setDoOutput(true);
                        //Post方式不能缓存,需手动设置为false
                        connection.setUseCaches(false);
                        // 设置请求参数
                        if (requestParams.getParamsMap().size() > 0) {
                            StringBuilder builder = new StringBuilder("");
                            for (Map.Entry<String, String> item : requestParams.getParamsMap().entrySet()) {
                                if (!TextUtils.isEmpty(builder)) {
                                    builder.append("&");
                                }
                                builder.append(item.getKey()).append("=")
                                        .append(isContainChinese(item.getValue())
                                                ? URLEncoder.encode(item.getValue(), "UTF-8")
                                                : item.getValue());
                            }
                            OutputStream connectionOutputStream = connection.getOutputStream();
                            connectionOutputStream.write(builder.toString().getBytes());
                            connectionOutputStream.flush();
                        }
                    }else {

                    }

                    // 请求 结果
                    if (connection.getResponseCode() == 200) {
                        InputStream inputStream = connection.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                        String line;
                        while ((line = bufferedReader.readLine()) != null) {
                            result.append(line);
                        }

                        Log.e("httpUrl",result.toString());

                        inputStream.close();
                        inputStreamReader.close();
                        bufferedReader.close();
                    } else {
                        callback.get().onError("网络请求失败  " + connection.getResponseCode() + "  " + connection.getResponseMessage(), requestParams.getRequestTag());
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (connection != null) {
                        connection.disconnect();
                    }
                }

                return result.toString();

            }


            return null;
        }

        @Override
        protected void onPostExecute(Object o) {
            super.onPostExecute(o);
            String result = String.valueOf(o);
            dealWithResponseInfo(result);
        }

        /**
         * 匹配请求参数 是否有中文 进行 edcode 否则低版本 安卓报错
         */
        public boolean isContainChinese(String str) {
            try {
                Pattern p = Pattern.compile("[\u4e00-\u9fa5]");
                Matcher m = p.matcher(str);
                if (m.find()) {
                    return true;
                }
                return false;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }

        /**
         * 处理 gson 解析数据
         */
        private void dealWithResponseInfo(String response) {
            if (callback.get() == null) {
                ToastUtil.showMsg("callback is null");
                return;
            }
            if (TextUtils.isEmpty(response)) {
                callback.get().onError("空数据~",requestParams.getRequestTag());
                return;
            }

            if (requestParams.getParseClass() == null) {
                callback.get().onSuccess(response,requestParams.getRequestTag());
            } else {
                Object gsonData = new Gson().fromJson(response, requestParams.getParseClass());
                callback.get().onSuccess(gsonData,requestParams.getRequestTag());
            }
        }
    }

    /**
     * 网络请求
     * @param requestParams 请求参数
     * @param callback 回调
     */
    public void startRequest(HttpRequestParams requestParams, HttpCallback callback) {
        // 异步请求
        new HttpTask(callback).execute(requestParams);
    }


}

 

package com.example.administrator.words.http;

/**
 * Created by ldp.
 * <p>
 * Date: 2021-01-30
 * <p>
 */
public enum HttpRequestMethod {

    // get 方法
    GET,
    // post 方法
    POST
    // 其他方法

}

 

package com.example.administrator.words.http;

/**
 * Created by ldp.
 * <p>
 * Date: 2021-01-30
 * <p>
 */
public interface HttpCallback {

    /**
     * 请求成功 回调
     * @param gsonData 返回数据 如果指定了 实体类 将被 gson 解析为指定类型
     * @param requestTag 多个请求时 可以做区分请求 请求标记
     */
    void onSuccess(Object gsonData, Object requestTag);

    /**
     * 请求失败 回调
     * @param errorMsg 错误消息
     * @param requestTag 请求标记
     */
    void onError(String errorMsg, Object requestTag);

}

 

package com.example.administrator.words.http;

import java.util.HashMap;

/**
 * Created by ldp.
 * <p>
 * Date: 2021-01-30
 * <p>
 * Summary:
 * <p>
 * api path:
 */
public class HttpRequestParams {

    // 默认 get 方式 请求数据
    private HttpRequestMethod requestMethod = HttpRequestMethod.GET;
    // 请求 参数 map
    private HashMap<String, String> paramsMap = new HashMap<>();
    // header contentType
    private String contentType;
    // 设置 json 解析的实体类
    private Class<?> parseClass;
    // 请求链接
    private String requestUrl;
    // 请求 标记
    private Object requestTag;

    public HttpRequestParams(){
        paramsMap.clear();
    }

    @Deprecated
    public HttpRequestParams(String requestUrl) {
        this(requestUrl, null);
    }

    /**
     * 常规 get 请求
     */
    public HttpRequestParams(String requestUrl, Class<?> parseClass) {
        this(requestUrl, HttpRequestMethod.GET, parseClass);
    }

    /**
     * 指定 get或者post请求
     *
     */
    public HttpRequestParams(String requestUrl, HttpRequestMethod requestMethod, Class<?> parseClass) {
        this.requestUrl = requestUrl;
        this.requestMethod = requestMethod;
        this.parseClass = parseClass;
        this.paramsMap.clear();
    }

    public void put(String key, Object value) {
        paramsMap.put(key, String.valueOf(value));
    }

    public HashMap<String, String> getParamsMap() {
        return paramsMap;
    }

    public String getContentType() {
        return contentType;
    }

    public void setContentType(String contentType) {
        this.contentType = contentType;
    }

    public Class<?> getParseClass() {
        return parseClass;
    }

    public HttpRequestMethod getRequestMethod() {
        return requestMethod;
    }

    public void setRequestMethod(HttpRequestMethod requestMethod) {
        this.requestMethod = requestMethod;
    }

    public void setParamsMap(HashMap<String, String> paramsMap) {
        this.paramsMap = paramsMap;
    }

    public void setParseClass(Class<?> parseClass) {
        this.parseClass = parseClass;
    }

    public String getRequestUrl() {
        return requestUrl;
    }

    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }

    public Object getRequestTag() {
        return requestTag;
    }

    public void setRequestTag(Object requestTag) {
        this.requestTag = requestTag;
    }
}

举个例子 ,代码为 kotlin

    private fun requestApiTranslateContent() {
        if (TextUtils.isEmpty(content_tv?.text?.toString())) {
            ToastUtil.showMsg("翻译内容不能为空~")
            return
        }

        val num = (Math.random() * 10000).toInt()
        val str = content_tv?.text?.toString()

        var httpRequestParams: HttpRequestParams = HttpRequestParams()


      // get请求  httpRequestParams = HttpRequestParams(Constants.BAI_DUI_TRANSLATE_API_URL, HttpRequestMethod.GET, TranslateBean::class.java)

        // post 请求
        httpRequestParams = HttpRequestParams(Constants.BAI_DUI_TRANSLATE_API_URL, HttpRequestMethod.POST, TranslateBean::class.java)
        httpRequestParams.contentType = "application/x-www-form-urlencoded"

        httpRequestParams.put("q", str)
        httpRequestParams.put("from", "auto")//翻译的内容 语言属于 哪一种 auto 自动监测
        httpRequestParams.put("to", translationType)
        httpRequestParams.put("appid", "xxxxxx")
        httpRequestParams.put("salt", num)
        httpRequestParams.put("sign", MD5.md5("xxxxxx"))

        showCustomLoadingDialog()

        HttpHelper.getInstance().startRequest(httpRequestParams, object : HttpCallback {
            override fun onSuccess(gsonData: Any, requestTag: Any) {
                dismissCustomLoadingDialog()
                if (gsonData is TranslateBean) {
                    val transResult = gsonData.trans_result
                    val result = StringBuilder()
                    if (transResult.isNullOrEmpty()) {
                        ToastUtil.showMsg("翻译出错,结果为空")
                        return
                    }
                    for (itemText in transResult) {
                        result.append(itemText.dst).append("\n")
                    }

                    result_txt_tv?.text = result.toString()
                }
            }

            override fun onError(errorMsg: String, requestTag: Any) {
                dismissCustomLoadingDialog()
                ToastUtil.showMsg(errorMsg)
            }

        })
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值